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