Можно ли вызвать хранимую процедуру Oracle с параметром вложенной таблицы из ODP.NET?

У меня есть хранимая процедура с парой параметров, представляющих собой вложенные таблицы.

CREATE TYPE FOO_ARRAY AS TABLE OF NUMBER;
CREATE TYPE BAR_ARRAY AS TABLE OF INTEGER;

CREATE PROCEDURE Blah(
  iFoos IN FOO_ARRAY,
  iBars IN BAR_ARRAY,
  oResults OUT SOMECURSORTYPE
) AS
BEGIN
  OPEN oResults FOR
    SELECT *
    FROM SomeTable T
    JOIN TABLE(iFoos) foos ON foos.column_value = T.foo
    JOIN TABLE(iBars) bars ON bars.column_value = T.bar;    
END

Используя ODP.NET (Oracle.DataAccess.dll), есть ли способ вызвать эту хранимую процедуру и передать массивы в эти параметры? Единственный способ передачи массивов, который я нашел, - это если тип параметра является ассоциативным массивом (другой тип коллекции, недоступный в SQL).


person Rotaerk    schedule 05.04.2011    source источник


Ответы (2)


Я заставил это работать следующим образом:

  • Создайте в базе данных тип типа «создать или заменить TYPE NT_LNG IS TABLE OF varchar(2);»
  • Создайте класс, реализующий IOracleCustomType и INullable (SimpleStringArray).
  • Создайте класс, реализующий IOracleCustomTypeFactory (SimpleStringArrayFactory). Пометьте его этим атрибутом "[OracleCustomTypeMappingAttribute("KNL.NT_LNG")]"

и вы передаете параметр следующим образом:

 SimpleStringArray sa1 = new SimpleStringArray();
 sa1.Array = new String[]{"aaa","bbb"};
 OracleParameter param = new OracleParameter("p_lngsrc", OracleDbType.Array, sa1, ParameterDirection.Input);
 param.UdtTypeName = "KNL.NT_LNG";

Удачи

person lnu    schedule 06.04.2011

Oracle также предлагает бесплатный инструмент для создания пользовательского класса .NET, который сопоставляется с вашим типом вложенной таблицы:

Загрузите «Инструменты разработчика Oracle для Visual Studio» (бесплатно), откройте обозреватель серверов, откройте узел «Определяемые пользователем типы», найдите определенный пользователем тип, щелкните правой кнопкой мыши и выберите «Создать пользовательский класс».

Вот пошаговое руководство, которое поможет вам начать работу с UDT в целом:

http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/hol08/dotnet/udt/udt_otn.htm

person Christian Shay    schedule 06.04.2011