Вызов функции с пользовательскими параметрами типа (Oracle ODP.NET)

Я использую функцию:

fu_has_permissions(udt_person('johny','superman'),'fly_away')

udt_person — определяемый пользователем тип:

create or replace TYPE udt_person AS OBJECT 
(name VARCHAR2(3), 
id VARCHAR2(18));

Я хочу использовать переменные связывания при вызове этой функции, но я не совсем уверен, что я делаю неправильно... Вот код:

......
OracleParameter udtPersParam = new OracleParameter();
udtPersParam.ParameterName = ":pUdtPers";
udtPersParam.UdtTypeName = "UDT_PERS";
string[] paramValues = { name, id };
udtPersParam.Value = paramValues;
OracleParameter pAction = new OracleParameter(":pAction", OracleDbType.Varchar2, 255);
pAction.Value = action;

parameters.Add(udtPartParam);
parameters.Add(pAction);

try
{
_loginOdr = DBFacade.ExecuteSelectQuery("select fu_has_permissions(:pUdtPart, :pAction) from dual", parameters);
}

Спасибо!


person maephisto    schedule 12.11.2010    source источник
comment
Какая у вас ошибка? Это опечатка, что UdtTypeName не соответствует имени типа Oracle?   -  person Alex Poole    schedule 12.11.2010
comment
Значение не попадает в ожидаемый диапазон., в строке udtPersParam.Value = paramValues;   -  person maephisto    schedule 12.11.2010


Ответы (3)


тип udt должен быть классом, реализующим IOracleCustomType и/или IOracleCustomTypeFactory, IOracleArrayTypeFactory.

к сожалению, вы не можете просто создать массив строк и передать его в

посмотрите образцы odp.net, которые поставляются с установкой odp %ora_home%\client_1\odp.net\samples\4\UDT

также ознакомьтесь с этими ссылками для получения примеров и пошаговых руководств http://developergeeks.com/article/35/working-with-user-defined-type-oracle-udt-and-custom-type-using-odp-net-11g http://www.codeproject.com/KB/database/ORACLE_UDT.aspx и http://st-curriculum.oracle.com/obe/db/hol08/dotnet/udt/udt_otn.htm

person Harrison    schedule 18.11.2010
comment
В моем случае 11.2 путь к образцам был другим: %ora_home%\product\11.2.0\client_1_x86\ODACsamples\odp.net\4\UDT - person Stealth Rabbi; 10.09.2013

На самом деле ничего не знаю об ODP.Net, но ошибка предполагает, что вам не нравится, когда вы пытаетесь использовать массив строк в качестве значения для параметра Oracle. Что не кажется необоснованным.

Быстрый поиск в Google «odp.net object varchar2» дал это сообщение на форуме OTN как первый результат; он включает пример использования объекта примерно на полпути, включая преобразование в типы объектов Oracle и из них.

person Alex Poole    schedule 17.11.2010

на вашем месте я бы взглянул на надстройку ODP для Visual Studio. При этом вы можете подключиться к своей базе данных, выбрать UDT в базе данных и «Создать пользовательский класс», чтобы получить класс .net, который вы можете использовать.

Загляните внутрь класса, и вы увидите, что имеет в виду Харрисон. Обратите особое внимание на OracleObjectMappingAttributes поверх свойств и на переопределения To/FromCustomObject.

При создании OracleCommand OracleParameter.Value должен быть классом этого типа.

Это должно помочь вам начать с высокого уровня. Слово предупреждения, хотя. Код, сгенерированный ODP, по меньшей мере уродлив — мы готовы отказаться от всех классов, сгенерированных ODP, в нашем собственном сценарии. Но вам нужно понять, что такое IOracleCustomType, IOracleCustomTypeFactory, IOracleArrayTypeFactory, INullable, прежде чем вы сможете это сделать.

Кстати, поскольку ваш конкретный вопрос касается массивов, вы можете посмотреть здесь Oracle NTYPE, а не TYPE.

person PeteH    schedule 22.02.2011