Может ли хранимая процедура Oracle, имеющая параметр вложенной таблицы, вызываться из ODP.NET? - PullRequest
2 голосов
/ 05 апреля 2011

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

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).

Ответы [ 2 ]

1 голос
/ 06 апреля 2011

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

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

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

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

1 голос
/ 06 апреля 2011

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

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

Удачи

...