3

カスタムオブジェクトの戻り型を持つOracle11gPL/SQLプロシージャを呼び出すJDBCコードを作成しています。戻り型を登録しようとすると、設定した型に応じてステートメントを実行すると、エラーとして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、Andrew

4

2 に答える 2

5

私はついに(他の人の少しの助けを借りて)これに対する答えを見つけました。それは3つの部分に分かれていました:

1つ目は、次のものを使用する必要があるということでした。

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

私が使おうとしていた単純なJDBCCallableStatementではなく。

2番目の部分は、「out」パラメーターを次のように登録する必要があることでした。

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

3番目の部分は、上記のパート2で暗黙的に示されているように、「DATA_SUMMARY_TAB」は大文字にする必要がありました。小文字にすると、次のような不可解なエラーメッセージが表示されます。

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

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)at oracle.sql.StructDescriptor。(StructDescriptor.java:320)

それでおしまい。

また、カスタムオブジェクトタイプはどのパッケージにも含まれていなかったことに注意してください。そうである場合は、3番目のパラメーターを少しハックする必要があるかもしれません。

于 2010-05-07T10:36:50.293 に答える
1

そこには2つの異なるおそらく矛盾するエラーメッセージがあります。

PLS-00306: wrong number or types of arguments in call to 'string' 

ユーザー定義タイプの説明とは何data_summary_tabですか? OracleTypes.CURSORJDBCResultSetと同等のREFCURSORが必要です。それはVARRAYdata_summary_tabまたはネストされたテーブルのように聞こえますが。

ORA-03115: unsupported network datatype or representation

これは、データベースサーバーよりも古いバージョンのクライアント(たとえば、10gまたは9i)を使用していることを示しています。通常、私たちはそれを回避することができますが、時にはそれは私たちが珍しいことをしているところにバグを引き起こす可能性があります。JDBCを介してユーザー定義型を呼び出すことが「珍しいこと」としてカウントされるべきかどうかはわかりませんが、そうなる可能性があると思います。

于 2010-04-19T14:27:51.290 に答える