Вызов функции с параметрами определенного пользователем типа (Oracle ODP.NET) - PullRequest
1 голос
/ 12 ноября 2010

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

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);
}

Спасибо!

Ответы [ 3 ]

4 голосов
/ 18 ноября 2010

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

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

посмотрите примеры odp.net, которые поставляются с установкой odp % Ora_home% \ client_1 \ odp.net \ образцы \ 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 / ОБЕ / дб / hol08 / DotNet / UDT / udt_otn.htm

1 голос
/ 22 февраля 2011

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

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

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

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

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

1 голос
/ 17 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...