2013-02-15 10 views
5

EDIT:この問題の回答のいくつかは、さまざまな問題を引き起こす可能性がありますが、実際にはデータベース接続上の自動コミット機能のバグに関連していました。クエリを実行した後にコミットを強制すると、データベースに変更が反映されたため、以下のコードがこのタイプのストアドプロシージャを呼び出す正しい方法です。Java:oracleデータベースのストアド・プロシージャをコール

私は、データベース。

手順は次のようになります。私はまったくのエラーを受信して​​いないよ

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) 
... 

私はこの

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

のように見えるとのトラブルを抱えているJavaコード、しかし何も存在しませんデータベースの変更が反映されます。 SQL Developerでプロシージャを実行すると、結果が表示されます。私はそれがコミットの問題のためかもしれないと思ったが、私が確立した接続は自動コミットモードになっている。

助けていただけたら幸いです!

+0

は、DBのVARCHARにorderIDを設定していますか? – PermGenError

+0

@PremGenError orderIDはDB内のVARCHAR2です – aeros

+0

2回目にパラメータの前後に引用符を入れてみてください:storedProc.setString( "1"、 "orderID"); – twoleggedhorse

答えて

1

この質問の回答の中には、さまざまな問題を抱える他の人に役立つものもありますが、実際にはデータベース接続上の自動コミット機能のバグに関連していました。クエリを実行した後にコミットを強制すると、データベースに変更が反映されました。このため、このタイプのストアドプロシージャを呼び出す正しい方法です。

1

Oracleデータベースでプロシージャの戻り値を取得できるようにするには、これを試してください。

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

あなたが別の戻り値を使用している場合は、SimpleJdbcCallこの方法地図:

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

および手順ここで働いて

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

の宣言。このブログを見てください。オラクルの10xeと11xeでテスト

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

関連する問題