web-dev-qa-db-ja.com

Java:Oracleデータベースのストアドプロシージャを呼び出す

編集:この質問の回答の一部はさまざまな問題を抱えている他の人を助けるかもしれませんが、解決策は実際にはデータベース接続の自動コミット機能のバグに関連していました!クエリの実行後にコミットを強制するとデータベースが発生しました変更を反映するため、以下に示すコードISこのタイプのストアドプロシージャを呼び出す正しい方法

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

私が問題を抱えているJavaコードは次のようになります

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

エラーはまったく発生しませんが、データベースの変更は反映されていません。 SQL Developerでプロシージャを実行すると、結果が表示されます。コミットの問題が原因かもしれないと思いましたが、確立した接続は自動コミットモードです。

どんな助けでもいただければ幸いです!

8
aeros

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

2
aeros

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

ここで働いた。このブログを見てください。

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

Oracle10xeおよび11xeでテスト済み。

1
SVerussa