Объединение связывания массивов и ассоциативных массивов - PullRequest
1 голос
/ 22 декабря 2011

Я хочу вызвать хранимую процедуру oracle10g «MyStoredProcedure» из моего кода на c # .net 4, используя ODP.NET (4.112.2.0).

PACKAGE MyPackage AS
TYPE ids_array IS TABLE OF NUMBER(8) INDEX BY BINARY_INTEGER;
PROCEDURE MyStoredProcedure
(
   param1 IN VARCHAR2(10),
   param2 IN ids_array
);

END MyPackage;

Я знаю, как использовать функцию связывания массива, чтобы можно было вставлять несколько строк в таблицу за одну поездку в одну базу данных.
Я также знаю, как вызвать хранимую процедуру, которая имеет ассоциативный массив в качестве параметра. То, что я не знаю, как объединить оба? Я посмотрел на http://docs.oracle.com/html/E10927_01/featOraCommand.htm#i1007888 для примера и примера кода (но его отдельные примеры). Спасибо

Ответы [ 2 ]

0 голосов
/ 30 января 2013

Хотя преобразование в CSV сработало, оно не очень эффективно, и вы ограничены 4000 символов.

Для достижения того, что вы хотите, лучше всего использовать цикл Форалла

например

PACKAGE MyPackage AS
TYPE ids_array IS TABLE OF NUMBER(8) INDEX BY BINARY_INTEGER;
PROCEDURE MyStoredProcedure
(
   param1 IN VARCHAR2(10),
   param2 IN ids_array
);
/
PACKAGE MyPackage BODY

ENDPROCEDURE MyStoredProcedure
(
   param1 IN VARCHAR2(10),
   param2 IN ids_array
) AS
BEGIN

    forall i in param2.FIRST .. param2.LAST
        INSERT INTO TABLE(col1,col2) VALUES (param1, params2(i));

END;

END MyPackage;

В ODP.NET у вас есть два параметра, первый из которых:varchar, второй является ассоциативным массивом.

0 голосов
/ 16 февраля 2012

Наконец мне пришлось преобразовать массив в строку, разделенную запятыми, и передать ее в качестве параметра. Так что внутри моего процесса я преобразовал свой CSV обратно в массив.

...