JDBCから次のpl/sqlプロシージャをコールしようとしています。Oracle JDBC呼び出しPL/SQLプロシージャ(入力パラメータ付き)レコード表
create or replace PACKAGE test AS
type testrec_r is record (
val1 number,
val2 varchar2(100)
);
type testarr_t is table of testrec_r index by binary_integer;
function test_func(i_data in testarr_t, o_sum out number, o_totallength out number) return number;
END test;
これは私が成功せず、それを起動しようとした方法である:
StructDescriptor recDescriptor = StructDescriptor.createDescriptor("test.testrec_r", conn);
STRUCT[] RECORDS_ARRAY = new STRUCT[2];
for (int i = 0; i < 2; i++) {
STRUCT oracle_record = new STRUCT(recDescriptor, conn, new
Object[] {i, "test"});
RECORDS_ARRAY[i] = oracle_record;
}
CallableStatement stmt = conn.prepareCall("{ call TEST.TEST_FUNC(?, ?, ?) }");
ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor("TEST.TESTARR_T", conn);
ARRAY oracle_array = new ARRAY(arrayDescriptor, conn, RECORDS_ARRAY);
// Bind the input record
stmt.setArray(1, oracle_array);
stmt.registerOutParameter(2, Types.NUMERIC);
stmt.registerOutParameter(3, Types.NUMERIC);
stmt.executeUpdate();
double out1 = stmt.getDouble(2);
double out2 = stmt.getDouble(3);
return new Object[] { out1, out2 };
私はOracleのJDBCは、PL/SQL構造体の種類をサポートしていないことを読みました。したがって、これは "無効な名前パターン:test.testrec_r"で失敗します
Javaからこのプロシージャを呼び出す方法はありますか。理想的には、Javaのlibray/APIを使用するだけですが、これはほとんど不可能なようです。これは単純なSQL呼び出しでpl/sqlパッケージをラップして呼び出す最良の回避策ですか?
P.私は、データベース接続にSpring JDBCTemplateを使用しています。
@ csm86この関数は何を返すべきですか?あなたの質問で私は機能が何を参照してくださいない。 – 0xdb
申し訳ありませんが、私は最後のコメントを誤って削除しました。これは配列の長さを返すダミー関数で、出力パラメータに数値の合計と文字列の長さを出力します。それは私が単純なSQLで取得したいものです。 – csm86
@ csm86 [OK]を、関数呼び出しで更新しました。総計は大きな問題ではありません。 – 0xdb