Можно ли вызвать хранимую процедуру Oracle с типом записи как параметр IN?
В Oracle у меня есть определение записи:
TYPE R_InData_tab IS RECORD ( ... );
TYPE InData_tab IS TABLE OF R_InData_tab INDEX BY BINARY_INTEGER;
Теперь я хочу установить этот тип записи как параметр:
PROCEDURE myProcedure (inRecord IN myPackage.InData_tab);
И вызовите эту процедуру из моего кода на С#.
Есть ли у кого-нибудь идеи?
Спасибо
Вы можете сделать это, отправив блок кода в качестве инструкции (прошло некоторое время с тех пор, как я работал с Oracle, поэтому синтаксис может быть слегка отключен:
DECLARE
param indata_tab;
BEGIN
FOR i IN 1 .. :field1%COUNT LOOP
param(i).field1 := :field1(i);
param(i).field2 := :field2(i);
END LOOP;
myProcedure(param);
END;
а затем вы привязываете параметры field1 и field2 к массивам.
Я думаю, что вы ограничены встроенными типами Oracle, определенными в OracleType. Если это так, вам придется написать хранимую процедуру, которая принимает регулярные параметры, создает значение типа и вызывает исходную процедуру.
Если вы используете Oracle Data Provider для .NET(ODP.NET), то определенно можно напрямую вызвать процедуру без использования массажа, предложенного erikkallen.
Однако я не уверен, что это решит вашу проблему. Похоже, вы определяете типы в пакете, который содержит процедуру. Чтобы использовать метод, связанный выше, ваши типы должны быть созданы как отдельные объекты в базе данных, используя DDL, например:
CREATE TYPE R_InData_tab AS OBJECT ( ... );
CREATE TYPE InData_tab AS TABLE OF R_InData_tab;
Это может потребовать незначительных изменений в пакете, поскольку типы INDEX BY не поддерживаются как объекты схемы, поэтому необходимо использовать вложенные таблицы (или varrays).