一千萬個為什麽

搜索

從0jdbc6 JDBCthin驅動程序調用帶有自定義對象的Oracle PL/SQL過程返回類型

我正在編寫一些JDBC代碼,它調用Oracle 11g PL/SQL procinedure,它具有自定義對象返回類型。每當我嘗試註冊我的返回類型時,根據我設置的類型,當執行語句時,我得到ORA-03115或PLS-00306作為錯誤。一個例子如下:

PLSQL代碼:

Procedure GetDataSummary (p_my_key    IN    KEYS.MY_KEY%TYPE,
                          p_recordset OUT   data_summary_tab,
                          p_status    OUT   VARCHAR2);

更多PLSQL代碼(自定義對象詳細信息):

CREATE OR REPLACE TYPE data_summary_obj
AS
   OBJECT (data_key             NUMBER,
           data_category        VARCHAR2 (100),
           sensitive_flag       VARCHAR2 (1),
           date_created         DATE,
           date_rep_received    DATE,
           date_first_offering  DATE,
           agency_data_ref      VARCHAR2 (13),
           change_code          VARCHAR2 (120),
           data_ref             VARCHAR2 (50),
           data_status          VARCHAR2 (100),
           data_count           NUMBER)
/

CREATE OR REPLACE TYPE data_summary_tab AS TABLE OF data_summary_obj
/ 

Java代碼:

String query = "begin manageroleviewdata.getdatasummary(?, ?, ?); end;");
CallableStatement stmt = conn.prepareCall(query);

stmt.setInt(1, 83);

stmt.registerOutParameter(2, OracleTypes.CURSOR);//Causes error: PLS-00306
stmt.registerOutParameter(3, OracleTypes.VARCHAR);

stmt.execute(stmt);//Error mentioned above thrown here.

任何人都可以向我提供一個示例,說明我如何做到這一點?我想這是可能的。但是我看不到OracleType的行集。 CURSOR,REF,DATALINK等等都失敗了。

如果這是一個愚蠢的問題,請道歉。我不是PL/SQL專家,可能在我的問題的某些方面使用了錯誤的術語。 (如果是,請編輯我)。

提前致謝。

Regs,安德魯

最佳答案

我終於(在其他人的幫助下)找到了答案。它分為三個部分:

首先是我需要使用:

OracleCallableStatement stmt = (OracleCallableStatement) conn.prepareCall(query);

而不是我一直試圖使用的簡單JDBC CallableStatement。

第二部分是我必須註冊我的“out”參數如下:

stmt.registerOutParameter(2, OracleTypes.STRUCT, "DATA_SUMMARY_TAB");

第三部分,上面第2部分中隱含的是“DATA_SUMMARY_TAB”必須是大寫的。如果你把它放在小寫,那麽你得到一個神秘的錯誤信息如下:

java.sql.SQLException: invalid name pattern: MYTEST.data_summary_tab

at oracle.jdbc.oracore.OracleTypeADT.initMetadata(OracleTypeADT.java:553)  at oracle.jdbc.oracore.OracleTypeADT.init(OracleTypeADT.java:469)  at oracle.sql.StructDescriptor.initPickler(StructDescriptor.java:390)  在oracle.sql.StructDescriptor。(StructDescriptor.java:320)

而已。

此外,請註意我們的自定義對象類型不在任何包中。如果是,您可能需要稍微破解第三個參數。

轉載註明原文: 從0jdbc6 JDBCthin驅動程序調用帶有自定義對象的Oracle PL/SQL過程返回類型