2015-08-06 11 views
7

La mia domanda è forse un po 'confusa. Ho il problema che sto chiamando una procedura con StoredProcedureCall da Java ad esempio:StoredProcedureCall 1x Varchar output 1x Uscita cursore

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

resset è il mio risultato come un cursore - come si può vedere - questo funziona senza problemi, mentre la procedura è simile a:

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; 

Ora ho aggiunto un parametro di output denominato "p_data" con una propria chiamata select

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; 

Ed è lì che ho avuto incollato.

non so come chiamare quella singola stringa che è il risultato della nuova istruzione select (mese) ho provato ad aggiungere

"call.addNamedOutputArgument("p_data");" 

ma che è stato totalmente sbagliato.

forse anche un bene da sapere è come gestire il risultato torno dal primo invito:

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); 
} 

ma come ho detto io non sono in grado di gestire la singola stringa per farlo come parametro creare un file html/excel e questo è il problema che devo gestire.

+0

non so Java in modo da non inviare una risposta, anche se alcuni pensieri: Il tuo 'SELECT' interrogazione ha messo il campo 'mese' in una nuova tabella denominata p_data ; 'Select Into' non creerà un resultset/return e data, esegue solo questa azione. Per recuperare i dati da P_data avrai bisogno di un'istruzione select separata (seleziona month da p_data.) Hai anche detto che P_Data è un tipo di dati varchar2, quando è effettivamente una tabella .. quindi non penso sia giusto. – JeffUK

+0

[this] (http://dreamand.me/java/java-jee7-jpa-stored-procedure-example/) può aiutare –

risposta

0

Penso che tu sia vicino. è necessario per ottenere il valore dal gruppo di risultati

provare qualcosa di simile

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"); 

Guarda anche questi frammenti

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

tuo 'SELECT' interrogazione è inserire ' mese 'campo in una nuova tabella p_data. 'Select Into' non restituirà i dati. È necessario scrivere una query di selezione separata per recuperare i dati dalla tabella p_data: Una volta terminata la scrittura in questo modo nella stored procedure. Prova a chiamare la procedura nel modo in cui la persona sopra ha detto.

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"); 

Spero che questo funzionerà per voi

Problemi correlati