2015-08-06 11 views
7

Meine Frage ist vielleicht ein wenig verwirrend. Ich habe das Problem, dass ich ein Verfahren mit StoredProcedureCall von Java Aufruf zB:StoredProcedureCall 1x Varchar Ausgabe 1x Cursor Ausgabe

StoredProcedureCall call = new StoredProcedureCall(); 
    call.setProcedureName("test"); 
    call.addNamedArgument("p_year"); 
    call.addNamedArgument("p_rel"); 
    call.useNamedCursorOutputAsResultSet("p_resset"); 

resset ist mein Ergebnis als Cursor - wie man sieht - das funktioniert ohne Probleme, während das Verfahren wie folgt aussieht:

create or replace PROCEDURE TEST (p_year IN NUMBER, 
       p_rel IN VARCHAR2, 
       p_resset OUT SYS_REFCURSOR) AS 
    BEGIN 
     OPEN p_resset FOR 
      SELECT NVL (s.KA, 'Summe') ka, 
        COUNT (s.AZ) az 
      FROM table1 s, 
        table2 w 
      WHERE s.year= w.year 
       AND w.relevant = p_rel 
       AND s.year = p_year 
END; 

Jetzt habe ich einen Ausgabeparameter "p_data" mit einem eigenen wählen Anruf

create or replace PROCEDURE TEST (p_year IN NUMBER, 
       p_rel IN VARCHAR2, 
       p_data OUT VARCHAR2, 
       p_resset OUT SYS_REFCURSOR) AS 
    BEGIN 
     SELECT month 
     INTO p_data 
     FROM month_table b 
     WHERE month_nr = (SELECT MAX (month) 
          FROM instruction 
          WHERE year= b.year) 
      AND year= p_year; 

OPEN p_resset FOR 
      SELECT NVL (s.KA, 'Summe') ka, 
        COUNT (s.AZ) az 
      FROM table1 s, 
        table2 w 
      WHERE s.year= w.year 
       AND w.relevant = p_rel 
       AND s.year = p_year 
END; 

Und das ist der Namen hinzugefügt, wo ich stecken.

Ich weiß nicht, wie die eine einzige Saite nennen, die das Ergebnis der neuen Select-Anweisung ist (Monat) I

"call.addNamedOutputArgument("p_data");" 

hinzuzufügen versucht, aber das war völlig falsch.

vielleicht auch gut zu wissen, wie ich das Ergebnis, das ich wieder vom ersten Anruf handhaben:

DataReadQuery query = new DataReadQuery(); 
       query.setCall(call); 
       query.addArgument("p_year"); 
       query.addArgument("p_rel"); 


       @SuppressWarnings("rawtypes") 
       List args = new ArrayList(); 
       args.add(dbyear); 
       args.add(relevation); 

       @SuppressWarnings("rawtypes") 
       List result= (List) s.executeQuery(query, args); 

    for (int i = 0; i < ergebnis.size(); i++){ 
    testDto record = new testDto(); 
    ArrayRecord ar=(ArrayRecord) ergebnis.get(i); 

    record.setKa((ar.get("ka")).toString()); 
    record.setAz((ar.get("az")).toString()); 

    System.out.println("cursor : " + ergebnis.get(i)); 

    result.add(ergebnis); 
} 

aber wie gesagt, ich nicht in der Lage bin die einzige Zeichenfolge zu behandeln es als Parameter zu erhalten um eine html/excel-datei zu erstellen, und das ist das Problem, das ich behandeln muss.

+0

Wissen Java nicht so keine Antwort veröffentlichen, einige Gedanken aber: Ihr ‚Wählen Sie in‘ Abfrage hat setzen Sie das Feld ‚Monat‘ in eine neue Tabelle namens p_data ; 'Select Into' erzeugt keine Ergebnismenge/Rückgabe und Daten, führen Sie diese Aktion nur aus. Um die Daten von P_data zu erhalten, benötigen Sie eine separate Select-Anweisung (wählen Sie einen Monat aus p_data.) Sie haben auch gesagt, dass P_Data ein varchar2-Datentyp ist, wenn es tatsächlich eine Tabelle ist .. also ich denke nicht, dass das richtig ist. – JeffUK

+0

[this] (http://dreamand.me/java/java-jee7-jpa-stored-procedure-example/) kann helfen –

Antwort

0

Ich denke, Sie sind in der Nähe. Sie müssen den Wert aus dem resultset

versuchen so etwas wie

StoredProcedureCall call = new StoredProcedureCall(); 
    call.setProcedureName("test"); 
    call.addNamedArgument("p_year"); 
    call.addNamedArgument("p_rel"); 
    call.addNamedOutputArgument("p_data"); 
    call.useNamedCursorOutputAsResultSet("p_resset"); 


    @SuppressWarnings("rawtypes") 
    List result= (List) s.executeQuery(query, args); 
    DatabaseRecord record = (DatabaseRecord)results.get(0); 
    String data = (String) record.get("p_data"); 

Schauen Sie sich diese Schnipsel

http://www.ctmmc.net/how-to-call-stored-procedures

http://blog.yenlo.com/nl/calling-oracle-stored-procedures-from-eclipselink-with-multiple-out-parameters

0

Ihre 'Wählen Sie in' Abfrage hat einfügen bekommen ' Monat Feld in eine neue Tabelle p_data. 'Select Into' gibt keine Daten zurück. Sie müssen separate Select-Abfrage schreiben, um Daten aus der Tabelle p_data zu holen: Sobald Sie fertig sind, schreiben Sie dies in der gespeicherten Prozedur. Versuchen Sie, die Prozedur auf die Art und Weise aufzurufen, wie die oben genannte Person gesagt hat.

StoredProcedureCall call = new StoredProcedureCall(); 
call.setProcedureName("test"); 
call.addNamedArgument("p_year"); 
call.addNamedArgument("p_rel"); 
call.addNamedOutputArgument("p_data"); 
call.useNamedCursorOutputAsResultSet("p_resset"); 


    @SuppressWarnings("rawtypes") 
    List result= (List) s.executeQuery(query, args); 
    DatabaseRecord record = (DatabaseRecord)results.get(0); 
    String data = (String) record.get("p_data"); 

hoffen, dass dies für Sie arbeiten