2010-11-12 52 views
1

J'utilise une fonction:Appel d'une fonction avec des paramètres de type définis par l'utilisateur (Oracle ODP.Net)

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

udt_person est un type défini par l'utilisateur:

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

Je veux utiliser bind les variables Whan appelant cette fonction, mais je ne suis pas vraiment sûr de ce que je fais mal ... Voici le 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); 
} 

Merci!

+0

Quelle erreur obtenez-vous? Est-ce une faute de frappe que 'UdtTypeName' ne correspond pas au nom de type Oracle? –

+0

"La valeur ne correspond pas à la plage attendue.", À la ligne udtPersParam.Value = paramValues; – maephisto

Répondre

4

le type UDT doit être une classe qui implémente IOracleCustomType et/ou IOracleCustomTypeFactory, IOracleArrayTypeFactory

unfortuntately vous ne pouvez pas créer un tableau de chaînes et de le transmettre dans

regard dans les échantillons de ODP.Net que venir avec l'installation de odp % ORA_HOME% \ client_1 \ odp.net \ samples \ 4 \ UDT

également vérifier ces liens pour les échantillons et soluces 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 et http://st-curriculum.oracle.com/obe/db/hol08/dotnet/udt/udt_otn.htm

+0

Le chemin vers les exemples était différent dans mon cas de 11.2: % ora_home% \ product \ 11.2.0 \ client_1_x86 \ ODACsamples \ odp.net \ 4 \ UDT –

+0

Aussi, le deuxième lien ici ne fonctionne plus pour moi . –

1

Ne sais vraiment rien sur ODP.Net, mais l'erreur suggère qu'il n'aime pas que vous essayez d'utiliser un tableau de chaînes comme valeur pour un paramètre Oracle. Ce qui ne semble pas déraisonnable. Un rapide google de 'objet odp.net varchar2' a donné this OTN forum post comme premier résultat; il inclut un exemple d'utilisation d'un objet à mi-chemin, y compris la conversion vers et depuis des types d'objets Oracle.

1

si je vous je jeter un oeil à l'ODP add-in pour Visual Studio. Avec cela, vous pouvez vous connecter à votre base de données, sélectionnez un UDT sur la base de données, et "Générer une classe personnalisée" pour obtenir une classe .net que vous pouvez utiliser.

Regardez à l'intérieur de la classe et vous verrez ce que Harrison veut dire. Portez une attention particulière à OracleObjectMappingAttributes sur les propriétés, et les remplacements de To/FromCustomObject. Lorsque vous construisez votre OracleCommand, OracleParameter.Value doit être une classe de ce type.

Cela devrait vous aider à démarrer à un niveau élevé. Un mot d'avertissement cependant. Le code généré par ODP est pour le moins laid - nous sommes sur le point d'abandonner toutes les classes générées par ODP dans notre propre scénario. Mais vous aurez besoin de comprendre ce que des choses comme IOracleCustomType, IOracleCustomTypeFactory, IOracleArrayTypeFactory, INullable sont avant que vous soyez en mesure de le faire. Incidemment, puisque votre question spécifique entoure les tableaux, vous pourriez vouloir regarder les NTYPE Oracle ici, plutôt que TYPE.