Quelle est la bonne façon d'appeler une fonction Oracle stockée à partir ado.net et obtenir le résultat?
-
21-09-2019 - |
Question
J'ai une base de code vb.net utilisant ADO pour se connecter à une base de données Oracle. Nous avons beaucoup de procédures stockées que nous appelons, certains avec plusieurs paramètres sur. Cependant, je dois maintenant appeler une fonction stockée, et ce n'est pas clair pour moi comment obtenir le résultat de la fonction de retour dans mon code VB.
Modifier. Je retourne un entier
Comment appeler correctement une fonction stockée oracle de ado.net?
La solution
Je suppose que vous utilisez ODP.net (natif du client Oracle pour .net).
Disons que vous avez 2 fonctions stockées Oracle comme ceci:
FUNCTION my_func
(
p_parm1 VARCHAR2
, p_parm2 NUMBER
) RETURN VARCHAR2
AS
BEGIN
RETURN p_parm1 || to_char(p_parm2);
END;
FUNCTION my_func2 RETURN SYS_REFCURSOR
AS
v_cursor SYS_REFCURSOR;
BEGIN
OPEN v_cursor FOR
SELECT 'hello there Sean' col1
FROM dual
UNION ALL
SELECT 'here is your answer' col1
FROM dual;
RETURN v_cursor;
END;
L'une des fonctions retourne un VARCHAR2 et les autres retours ref curseur. Côté VB, vous pouvez faire ceci:
Dim con As New OracleConnection("Data Source=xe;User Id=sandbox;Password=sandbox; Promotable Transaction=local")
Try
con.Open()
Dim cmd As OracleCommand = con.CreateCommand()
cmd.CommandText = "test_pkg.my_func"
cmd.CommandType = CommandType.StoredProcedure
Dim parm As OracleParameter
parm = New OracleParameter()
parm.Direction = ParameterDirection.ReturnValue
parm.OracleDbType = OracleDbType.Varchar2
parm.Size = 5000
cmd.Parameters.Add(parm)
parm = New OracleParameter()
parm.Direction = ParameterDirection.Input
parm.Value = "abc"
parm.OracleDbType = OracleDbType.Varchar2
cmd.Parameters.Add(parm)
parm = New OracleParameter()
parm.Direction = ParameterDirection.Input
parm.Value = 42
parm.OracleDbType = OracleDbType.Int32
cmd.Parameters.Add(parm)
cmd.ExecuteNonQuery()
Console.WriteLine("result of first function is " + cmd.Parameters(0).Value)
'''''''''''''''''''''''''''''''''''''''''''''
' now for the second query
'''''''''''''''''''''''''''''''''''''''''''''
cmd = con.CreateCommand()
cmd.CommandText = "test_pkg.my_func2"
cmd.CommandType = CommandType.StoredProcedure
parm = New OracleParameter()
parm.Direction = ParameterDirection.ReturnValue
parm.OracleDbType = OracleDbType.RefCursor
cmd.Parameters.Add(parm)
Dim dr As OracleDataReader = cmd.ExecuteReader()
While (dr.Read())
Console.WriteLine(dr(0))
End While
Finally
If (Not (con Is Nothing)) Then
con.Close()
End If
End Try
Autres conseils
' Create ODP database connection
Dim constr As String = (("User Id=" & Properties.Settings.[Default].DbUid & "; Password=") + Properties.Settings.[Default].DbPwd & "; Data Source=") + Properties.Settings.[Default].DbTnsName & "; Pooling=false"
Dim con As New OracleConnection(constr)
Dim cmd As New OracleCommand()
cmd.Connection = con
Try
cmd.CommandText = "test_pkg.test_function"
cmd.CommandType = CommandType.StoredProcedure
'Always add return parameter before other parameters when calling database functions in .net!!
cmd.Parameters.Add("result", OracleDbType.Int32).Direction = ParameterDirection.ReturnValue
cmd.Parameters.Add("param1", OracleDbType.Varchar2).Value = "something"
cmd.Parameters.Add("param2", OracleDbType.Varchar2).Value = "something else"
con.Open()
cmd.ExecuteNonQuery()
Console.WriteLine(CInt(cmd.Parameters("result").Value))
Finally
' Cleanup
con.Close()
cmd.Dispose()
con.Dispose()
End Try