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

Ответ 1

Я сделал это так:

  • Создайте тип в базе данных, например: "создайте или замените 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";

Удача

Ответ 2

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

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

Здесь вы найдете пошаговое руководство для начала работы с UDT:

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