Рассматривали ли вы передачу данных в хранимую процедуру в формате XML?Oracle может обрабатывать типы данных XML .Есть также некоторые связанные вопросы по переполнению стека:
Однако в некоторых ситуациях 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
типах данных привязка будет немного сложнее ...