Calling a function with user defined type parameters (Oracle ODP.NET)

核能气质少年 提交于 2019-12-08 05:38:33

问题


I'm using a function :

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

udt_person is a user defined type :

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

I want to use bind variables whan calling this function, but i'm not really sure what am i doing wrong ... Here's the code :

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

Thanks!


回答1:


the udt type must be a class that implements IOracleCustomType and/or IOracleCustomTypeFactory, IOracleArrayTypeFactory

unfortuntately you cannot just create a string array and pass it in

look in the odp.net samples that come with the odp installation %ora_home%\client_1\odp.net\samples\4\UDT

also check out these links for samples and walkthroughs 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 and http://st-curriculum.oracle.com/obe/db/hol08/dotnet/udt/udt_otn.htm




回答2:


Don't know anything about ODP.Net really, but the error suggests that it doesn't like you trying to use a string array as the value for an Oracle parameter. Which doesn't sound unreasonable.

A quick google of 'odp.net object varchar2' gave this OTN forum post as the first result; it includes an example of using an object about half-way down, including converting to and from Oracle object types.




回答3:


if I were you I'd have a look at the ODP add-in to Visual Studio. With this you can connect to your database, select a UDT on the database, and "Generate Custom Class" to get a .net class you can use.

Look inside the class and you'll see what Harrison means. Pay particular attention to the OracleObjectMappingAttributes on top of the properties, and the overrides of To/FromCustomObject.

When you construct your OracleCommand, the OracleParameter.Value needs to be a class of this type.

That should get you started at a high level. A word of warning, though. The code generated by ODP is ugly to say the least - we're on the point of ditching all ODP-generated classes in our own scenario. But you'll need to understand what things like IOracleCustomType, IOracleCustomTypeFactory, IOracleArrayTypeFactory, INullable are before you'll be in a position to do this.

Incidentally since your specific question surrounds arrays, you might want to look at Oracle NTYPEs here, rather than TYPEs.



来源:https://stackoverflow.com/questions/4162364/calling-a-function-with-user-defined-type-parameters-oracle-odp-net

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!