簡體   English   中英

Java:在oracle數據庫中調用存儲過程

[英]Java: Calling a stored procedure in an oracle database

編輯:雖然此問題中的某些答案可能會幫助其他人解決不同的問題,但該解決方案實際上與數據庫連接上的自動提交功能中的某些錯誤有關! 執行查詢后強制執行提交會使數據庫反映更改,因此下面顯示的代碼是調用此類型存儲過程的正確方法

我正在嘗試在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中運行該過程時,會看到結果。 我以為可能是因為提交問題,但是我建立的連接處於自動提交模式。

任何幫助,將不勝感激!

雖然此問題中的某些答案可能會幫助其他人解決其他問題,但該解決方案實際上與數據庫連接上具有自動提交功能的一些錯誤有關! 執行查詢后強制執行提交會導致數據庫反映更改,因此問題中顯示的代碼是調用此類型存儲過程的正確方法!

為了能夠捕獲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();
        }
    }

如果您以這種方式使用其他的Return Map 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

在Oracle 10xe和11xe上進行了測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM