あなたがXMLとしてストアドプロシージャにデータを渡すと考えたことがありますか? OracleはXML data typesを処理できます。スタックオーバーフロー上のいくつかの関連の質問もあります
しかし、XMLは、いくつかの状況では、パフォーマンスキラーかもしれません。別のオプションは、REF CURSOR型を使用することです:ややデータを構造化し、まだ弱い型付けされたカーソルを上の動作させるための方法だろう
PreparedStatement stmt = connection.prepareStatement(
"DECLARE "
+ " records SYS_REFCURSOR; "
+ "BEGIN "
+ " OPEN records FOR "
+ " SELECT * FROM TABLE(?); "
+ " my_proc(records); "
+ "END;");
// Set the records as an array
stmt.setArray(1, records);
。上記の選択はどのような形式でも可能です。
が
CREATE TYPE rec AS OBJECT (ID NUMBER(7), VALUE CLOB);
CREATE TYPE tab AS TABLE OF rec;
TABLE OF VARCHAR2
REF CURSOR
期待して簡単な例の手順の実装:この例では、私はあなたがこのような何かを結合されることを仮定している結合
CREATE OR REPLACE PROCEDURE my_proc(cur IN SYS_REFCURSOR) IS
-- Using a pre-existing TABLE TYPE from the SYS schema for the example
array ORA_MINING_VARCHAR2_NT;
BEGIN
FETCH cur BULK COLLECT INTO array;
FOR i IN array.FIRST .. array.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(array(i));
END LOOP;
END;
JDBCは、次のようになり
String[] strings = new String[] {"a", "b", "c"};
ArrayDescriptor desc = new ArrayDescriptor("ORA_MINING_VARCHAR2_NT", c);
ARRAY array = new ARRAY(desc, c, strings);
stmt.setArray(1, array);
stmt.executeUpdate();
データタイプがTABLE OF OBJECT
の場合、バインディングはもう少し複雑です...
あなたが以前の質問のいくつかから答えを受け入れるなら、私はあなたの答えを持っています! – tbone
@tbone答えが受け入れられました。あなたの提案に感謝します:)最初に –
はXMLTypeのラインに沿って考えていましたが、Lukasのコメントuはそのアプローチを拒否していました。 Oracleに渡す必要があるデータの例を挙げられますか? – tbone