Вызов хранимой процедуры Oracle с записью в качестве параметра - PullRequest
2 голосов
/ 02 марта 2010

Можно ли вызвать хранимую процедуру 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);

И вызовите эту процедуру из моего кода C #.

У кого-нибудь есть идея?

Спасибо

Ответы [ 3 ]

1 голос
/ 02 марта 2010

Вы можете сделать это, отправив блок кода в качестве выражения (прошло много времени с тех пор, как я работал с 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 к массивам.

1 голос
/ 02 марта 2010

Я думаю, что вы ограничены встроенными типами Oracle, определенными в OracleType . В таком случае вам придется написать хранимую процедуру, которая принимает обычные параметры, создает значение типа и вызывает исходную процедуру.

0 голосов
/ 05 марта 2010

Если вы используете 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 не поддерживаются в качестве объектов схемы, поэтому необходимо использовать вложенные таблицы (или массивы).

...