您是否考虑过将数据作为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