2015-09-11 18 views
5

Ho restituito la procedura Db2 che restituisce il cursore per una tabella.Come risolvere l'eccezione verificatasi durante il recupero di CURSOR dall'istruzione Callable in Java?

Questa procedura viene chiamata dal mio codice Java e centratura per recuperare cursore come un set di risultati e avere log eccezione SQLException fluente,

com.ibm.db2.jcc.am.jo: [jcc][t4][10335][10366][4.7.85] 
Invalid operation: Connection is closed. ERRORCODE=-4470, SQLSTATE=08003 
    at com.ibm.db2.jcc.am.dd.a(dd.java:666) 
    at com.ibm.db2.jcc.am.dd.a(dd.java:60) 

Ho cercato una soluzione per questa eccezione e ho trovato questa soluzione sul sito web IBM link che suggerire di modificare la configurazione del registro,

Aumentare la dimensione del file di registro e il numero di file di registro primario e secondario . Il valore num_log_span può anche essere regolato.

Ecco procedura di esempio,

CREATE OR REPLACE PROCEDURE ABC(c_dump OUT SYS_REFCURSOR) IS 
BEGIN 
    open c_dump FOR 
    select feild1,feild1,.... from RSPNSE_TABLE; 
END; 

codice Java è riportata qui sotto,

public void callStoredProc(){ 

     Connection dbConnection = null; 
     CallableStatement callableStatement = null; 
     ResultSet rs = null; 

     String proc = "{call ABC(?)}"; 

     try { 
      dbConnection = connection; 
      callableStatement = dbConnection.prepareCall(proc); 

      callableStatement.registerOutParameter(1, DB2Types.CURSOR); 


      // execute getDBUSERCursor store procedure 
      callableStatement.executeUpdate(); 

      // get cursor and cast it to ResultSet 
      rs = (ResultSet) callableStatement.getObject(1); 


     } catch (SQLException e) { 

      e.printStackTrace(); 
      System.out.println(e.getMessage()); 

     } 

    } 

Ora, in questo codice Java sta rompendo in questa linea callableStatement = dbConnection.prepareCall(proc);

Nota: Nonostante il registro delle eccezioni contenga "Connessione chiusa" testo Voglio dire che ho stabilito con successo la connessione con il recupero normale del database usando JDBC non ha problemi.

+0

L'autista dice che la connessione è chiusa, tu dici che non lo è; a chi credere? Potresti voler chiamare 'isClosed()' o 'isValid()' sulla connessione appena prima di 'prepareCall()'? – mustaccio

+0

Potete fornire prodotti usati e numeri di versione? Server OS, driver DB2 e JDBC? –

risposta

0

Il tentativo di chiamata fallita indica che non si dispone di una connessione aperta. Dovrai scavare nell'SQLException e determinare esattamente il perché.