2013-06-27 36 views
1

RECORD類型是否與JDBC不兼容?正在使用的驅動程序OJDBC6.jar我們可以將Oracle RECORD TYPE與Java Callable語句集成嗎?

Java代碼:

dbStrategy.openConnection(); 
     WrappedConnectionJDK6 wrapped = (WrappedConnectionJDK6) dbStrategy.getConnection(); 
     OracleConnection oracleConnection = (OracleConnection) wrapped.getUnderlyingConnection(); 
     CallableStatement callableStatement = oracleConnection.prepareCall("{call XXX_Info_Utl_Pkg.get_order_admin(?,?,?,?,?)}"); 
     callableStatement.setInt(1, Integer.parseInt(orderNumber)); 
     callableStatement.registerOutParameter(2, OracleTypes.ARRAY, "XXX_INFO_UTL_PKG.SEAGRS_ORDER_REC"); 
     callableStatement.registerOutParameter(3, OracleTypes.NUMBER); 
     callableStatement.registerOutParameter(4, OracleTypes.VARCHAR); 
     callableStatement.registerOutParameter(5, OracleTypes.NUMBER); 

而且甲骨文代碼:

PROCEDURE get_order_admin(
      p_order_num_in IN NUMBER, 
      p_order_admin_out OUT XXX_info_utl_pkg.seagrs_order_rec, 
      p_error_code_out OUT PLS_INTEGER, 
      p_error_msg_out OUT VARCHAR2, 
      p_ret_status_out OUT PLS_INTEGER); 


TYPE seagrs_order_rec 
IS 
    record 
    (
     order_admin  VARCHAR2(10), 
     contact_name  VARCHAR2(50), 
     contact_email_addr VARCHAR2(100), 
     contact_phone_num VARCHAR2(30)); 

現在所面臨這裏的錯誤是 -

異常:無效的名稱模式:XXX_INFO_UTL_PKG.SEAGRS_ORDER_REC

+0

你能發佈完整的錯誤堆棧嗎? – user75ponic

+0

14:53:47,546錯誤[com.commands.RecRetOrderAdminInfoCmd](http-/0.0.0.0:8080-1)EXCEPTION OCCURED ::方法名稱:execute,異常:無效名稱模式:XXX_INFO_UTL_PKG.XXX_ORDER_REC 14:53:47,562 ERROR [com.daos.ReceivingServiceDAO](http-/0.0.0.0:8080-1)異常發生:ReceivingServiceDAO,方法名稱:getOrderAdminInfo – musicar

+0

您的'seagrs_order_rec'是什麼'type'?數組或對象或表格? – user75ponic

回答

3

記錄類型不兼容JDBC驅動程序:

這是不可行的Oracle JDBC驅動程序,以支持調用 參數或具有非標量返回PL/SQL記錄,布爾值,或表 值元素類型。但是,Oracle JDBC驅動程序通過標量元素類型表支持 PL/SQL索引。

READ THIS

1

雖然你不能直接使用JDBC來獲取你的PL/SQL記錄類型,你可以寫一個匿名PL/SQL塊,返回記錄到一個局部變量,然後你就可以分解在其個別屬性如下:

DECLARE 
    rec XXX_info_utl_pkg.seagrs_order_rec; 
BEGIN 
    get_order_admin(?, rec, ?, ?, ?); 
    ? := rec.order_admin; 
    ? := rec.contact_name; 
    ? := rec.contact_email_addr; 
    ? := rec.contact_phone_num; 
END; 

您現在可以使用下面的JDBC代碼來調用程序:

try (CallableStatement s = con.prepareCall(" ... previous PL/SQL block ...")) { 
    s.setInt(1, Integer.parseInt(orderNumber)); 

    // Ordinary out parameters 
    s.registerOutParameter(2, Types.NUMBER); 
    s.registerOutParameter(3, Types.VARCHAR); 
    s.registerOutParameter(4, Types.NUMBER); 

    // Out parameters from your decomposed record 
    s.registerOutParameter(5, Types.VARCHAR); 
    s.registerOutParameter(6, Types.VARCHAR); 
    s.registerOutParameter(7, Types.VARCHAR); 
    s.registerOutParameter(8, Types.VARCHAR); 

    s.execute(); 
    // Now, retrieve all the out parameters 
} 

I have recently blogged about this technique more in detail。該博客文章還包含有關如何爲具有記錄IN/OUT參數的所有函數/過程自動生成匿名PL/SQL塊的說明。

相關問題