2011-12-22 8 views
1

Я хочу вызвать хранимую процедуру 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, например, и пример кода (но его отдельные примеры). Thanks

ответ

0

Мне, наконец, пришлось преобразовать массив в строку, разделенную запятой, и передать это как параметр. Поэтому внутри моей proc я преобразовал свой csv обратно в массив.

0

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

Чтобы достичь того, чего вы хотите, лучше всего было бы использовать Используйте FORALL петлю

например

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, второе ассоциативный массив.