2013-02-15 2 views
5

EDIT: Mentre alcune delle risposte in questa domanda possono aiutare gli altri con problemi diversi, la soluzione era in realtà correlata ad alcuni bug con la funzionalità di auto-commit su una connessione di database! Forzare un commit dopo aver eseguito la query ha indotto il database a riflettere le modifiche, quindi il codice mostrato di seguito È il modo corretto per chiamare una stored procedure di questo tipoJava: chiamata a una stored procedure in un database Oracle

Sto provando a chiamare una procedura memorizzata semplice in un oracolo Banca dati.

La procedura è simile al seguente:

procedure clear_orderProcDtlByOrdId(p_order_id in order_header.order_id%type, 
            p_transaction_id in sl_order_processing_dtl.transaction_id%type DEFAULT NULL, 
            p_item_action_id in sl_order_processing_dtl.item_action_id%type DEFAULT NULL) 
... 

il codice Java Ho problemi con un look come questo

try 
    { 
     CallableStatement storedProc = conn.prepareCall("{call PKG_PI_FRAUD.clear_orderProcDtlByOrdId(?)}"); 
     storedProc.setString(1, orderID); 
     storedProc.execute(); 
    } 
    catch (SQLException e) 
    { 
     e.printStackTrace(); 
    } 

Non sto ricevendo errori a tutti, ma non ci sono modifiche del database riflesse. Quando eseguo la procedura in SQL Developer, vedo i risultati. Ho pensato che potrebbe essere a causa di un problema di commit, ma la connessione che ho stabilito è in modalità auto-commit.

Qualsiasi aiuto sarebbe apprezzato!

+0

l'ordine è impostato su VARCHAR nel DB? – PermGenError

+0

@PremGenError orderID è un VARCHAR2 nel DB – aeros

+0

Provare a inserire le virgolette sul parametro, quindi sulla riga 2: storedProc.setString ("1", "orderID"); – twoleggedhorse

risposta

1

Mentre alcune delle risposte in questa domanda possono aiutare gli altri con problemi diversi, la soluzione era in realtà correlata ad alcuni bug con la funzione di auto-commit su una connessione di database! Forzare un commit dopo aver eseguito la query ha indotto il database a riflettere le modifiche, quindi il codice mostrato nella domanda è il modo corretto per chiamare una stored procedure di questo tipo!

1

Per essere in grado di acquisire il ritorno della procedura nel database Oracle, provare questo.

public static void main(String[] args) { 

     try { 

      Class.forName("oracle.jdbc.driver.OracleDriver"); 
      String url = "jdbc:oracle:thin:@localhost:1521:xe"; 
      Connection con = DriverManager.getConnection(url, db_user, password); 
      System.out.println("Connected to database"); 

      SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
      Date now = new java.sql.Date(simpleDateFormat.parse("12/02/2001").getTime()); 

      String command = "{call SALDOS(?,?)}"; 
      CallableStatement cstmt = con.prepareCall(command); 
      cstmt.registerOutParameter(2, Types.DECIMAL); 

      cstmt.setDate(1, now); 
      cstmt.execute(); 
      Double str = cstmt.getDouble(2); 

      cstmt.close(); 
      System.out.println("Retorno: " + str); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

Se si utilizza un diverso Resi Mappa SimpleJdbcCall questo modo:

SimpleJdbcCall call = Util.getSimpleJdbcCallInstance(); 
    call.setProcedureName("PROCED_CONDOMINIAL"); 
    call.declareParameters(
      new SqlParameter("CONDOMINIO", Types.VARCHAR), 
      new SqlParameter("BLOCO", Types.VARCHAR),, 
      new SqlOutParameter("P_NUMERO", Types.NUMERIC), 
      new SqlOutParameter("P_LOG", Types.VARCHAR)); 

    Map<String, Object> parametros = new HashMap<String, Object>(); 
    parametros.put("CONDOMINIO_IC", descricaoCondominio); 
    parametros.put("BLOCO_IC", imovelCondominial.getBloco()); 

    Map<String, Object> out = call.execute(parametros); 
    BigDecimal chave = (BigDecimal) out.get("P_NUMERO"); 
    imovelCondominial.setId(chave.longValue()); 

e la dichiarazione della procedura

create or replace PROCEDURE   PROCED_CONDOMINIAL 
       (CONDOMINIO   VARCHAR2, 
       BLOCO     VARCHAR2, 
       NUMERO    OUT NUMBER, 
       LOG     OUT VARCHAR2)  -- PARAMETROS DE SAIDAS (OUT).- 

lavorato qui. Guarda questo blog.

http://jameajudo.blogspot.com.br/2009/03/call-procedure-oracle-with-java-and.html

provata su Oracle 10xe e 11xe.