Oracle Хранимая процедура Структурированные Параметры - PullRequest
2 голосов
/ 13 февраля 2012

Я хочу передать набор «неизвестных» значений хранимой процедуре Oracle из Java-приложения Spring.Данные несколько структурированы, поэтому в настоящее время у нас есть сохраненный процесс, который принимает 2 сгустка, которые являются парами ключ / значение данных.Первый clob представляет одну запись, а второй clob представляет множество дочерних записей clob 1.

Это кажется очень неэффективным способом передачи данных, так как нам нужно создать строки в Java в forve plave, а затемданные должны быть проанализированы в сохраненной процедуре.

Я изучил структуры записей Oracle, однако создается впечатление, что вам необходимо сопоставить каждое поле в структуре записи с полем таблицы БД.проблема с этим подходом состоит в том, что а) элементы данных, которые мы отправляем каждый раз, отличаются (хотя основной набор данных остается неизменным) и б) некоторые элементы данных существуют только для целей принятия решений и не являются действительнымисохраняется в базе данных.

Итак, мой вопрос: что является наиболее эффективным средством передачи таких данных в хранимый процесс Oracle?Мы хотим сохранить гибкость возможности посылать наборы переменных параметров, а также иметь некоторое подобие структуры вокруг данных.

Заранее спасибо.

Барри

1 Ответ

3 голосов
/ 13 февраля 2012

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

...