Comment faire pour retourner un RefCursor à partir d'Oracle?
Je suis en train d'exécuter un définis par l'utilisateur Oracle une fonction qui retourne un RefCursor à l'aide de ODP.NET. Voici la fonction:
CREATE OR REPLACE FUNCTION PKG.FUNC_TEST (ID IN TABLE.ID%type)
RETURN SYS_REFCURSOR
AS
REF_TEST SYS_REFCURSOR;
BEGIN
OPEN REF_TEST FOR
SELECT *
FROM TABLE;
RETURN REF_TEST;
END;
/
Je peux appeler cette fonction en Crapaud (sélectionnez func_test(7) à partir du double) et de revenir à un CURSEUR. Mais j'ai besoin de pour obtenir le curseur à l'aide de C# et ODP.NET remplir un DataSet, mais je reçois une NullReferenceException - "la référence d'Objet n'est pas définie à une instance d'un objet". Voici ce que j'ai:
OracleConnection oracleCon = new OracleConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
OracleCommand sqlCom = new OracleCommand("select func_test(7) from dual", oracleCon);
sqlCom.Parameters.Add("REF_TEST", OracleDbType.RefCursor, ParameterDirection.ReturnValue);
OracleDataAdapter dataAdapter = new OracleDataAdapter();
dataAdapter.SelectCommand = sqlCom;
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet); //FAILS HERE with NullReferenceException
J'ai été en mesure de trouver beaucoup d'informations et d'exemples sur l'utilisation de procédures stockées et de ODP.NET mais pas autant pour le retour RefCursors de fonctions.
EDIT: je ne veux pas ajouter explicitement les paramètres d'entrée de l'objet OracleCommand (c'est à dire sqlCom.Parameters.Add("id", OracleDbType.Int32,ParameterDirection.Input).Value = 7;
) qui le rend difficile à mettre en œuvre ce qu'un générique du service web RESTful, mais je suis réservant que mon dernier recours, mais permettrait d'utiliser des procédures stockées à la place.
Toute aide est très appréciée!
:REF_TEST := func_test(7)
?Vous ne savez pas où l'utilisation de ce. Est-ce utilisé à la place du paramètre?
comme le OracleCommand chaîne, au lieu de le sélectionner. (Je devrais peut-être signaler que je ne sais rien à propos de ODP.Net mais qui a toujours l'air de mal *8-)
Alex, pas de chance avec ça. J'apprécie l'essayer 🙂
OriginalL'auteur Gady | 2010-11-08
Vous devez vous connecter pour publier un commentaire.
Je pense que vous êtes absent de la sqlCom.ExecuteNonQuery();
aussi, au lieu de l'exécution de la sélectionnez func_test(7) from dual; permet de commuter à l'exécution de la fonction et de passer en param
ceci est basé sur l'exemple de l'ODP qui peut être trouvé @ %ora_home%\Client_1\ODP.NET\samples\RefCursor\Sample5.csproj
Si vous voulez éviter (pour le meilleur ou pour le pire!) la coutume construit param collection pour chaque proc/appel de fonction, vous pouvez le contourner en utilisant des blocs anonymes dans votre code, j'ai règlements ultérieurs (une fois de plus, non testé!) le code ci-dessus pour refléter cette technique.
Voici un joli blog (de nul autre que Mark Williams) montrant cette technique.
http://oradim.blogspot.com/2007/04/odpnet-tip-anonymous-plsql-and.html
sqlCom.Parameters.Add("id", OracleDbType.Int32,ParameterDirection.Input).Value = 7;
) donc je peux facilement créer une instruction SQL à la volée.vous pouvez utiliser des blocs anonymes afin de lui donner le "générique" sentez que vous allez pour. J'ai changé l'exemple ci-dessus afin de refléter cette
OUI! Vous gagnez! Exactement ce que je cherchais!
OriginalL'auteur Harrison