您是否考慮過將數據作爲XML傳遞給存儲過程? Oracle可以處理XML data types。也有堆棧溢出一些相關的問題:
然而,XML可能在某些情況下,一個性能殺手。另一種選擇是使用REF遊標類型:
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 2012-02-13 12:37:10
@tbone現在接受答案。希望你的建議:) – 2012-02-13 13:58:12
起初是在思考XMLType的行,但看到盧卡斯的評論你拒絕了這種做法。你能舉一個你需要傳遞給Oracle的數據的例子嗎? – tbone 2012-02-13 14:34:24