J'essaie d'exécuter une fonction Oracle définie par l'utilisateur qui renvoie un RefCursor en utilisant ODP.NET. Voici la fonction:Comment renvoyer une fonction RefCursor de Oracle?
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 dans Toad (sélectionnez func_test (7) double) et retourner un curseur. Mais j'ai besoin d'obtenir le curseur en utilisant C# et ODP.NET pour remplir un DataSet, mais je reçois toujours une NullReferenceException - "Référence d'objet non définie à une instance d'un objet". Voici ce que je dois pour cela:
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 pu trouver beaucoup d'informations et d'échantillons sur l'utilisation des procédures stockées et ODP.NET, mais pas tant pour le retour RefCursors des fonctions.
EDIT: Je ne veux pas ajouter explicitement les paramètres d'entrée à l'objet OracleCommand (c.-à-sqlCom.Parameters.Add("id", OracleDbType.Int32,ParameterDirection.Input).Value = 7;
) comme qui le rend difficile à mettre en œuvre cela comme un service Web RESTful générique, mais je réserver comme mon dernier recours mais utiliserait plutôt des procédures stockées.
Toute aide est très appréciée!
Vous ajoutez un paramètre mais vous l'exécutez en tant que requête; ne voulez-vous pas faire quelque chose comme ': REF_TEST: = func_test (7)'? –
Vous ne savez pas où l'utiliser. Est-ce utilisé à la place du paramètre? – Gady
comme chaîne OracleCommand, au lieu de select. (Je devrais peut-être souligner que je ne sais rien sur ODP.Net, mais cela semble toujours faux * 8-) –