4

У меня есть кодовая база vb.net, использующая ado для подключения к базе данных Oracle. У нас есть много хранимых процедур, которые мы называем, некоторые с несколькими параметрами. Однако теперь мне нужно вызвать хранимую функцию, и мне непонятно, как вернуть результат функции обратно в мой код VB.Каков правильный способ вызова хранимой функции Oracle из ado.net и получения результата?

Редактировать: Я возвращаю целое число.

Как правильно вызвать функцию сохранения oracle с ado.net?

+0

что делает возвращение функции? – dcp

ответ

7

Предполагаю, что вы используете ODP.net (собственный клиент Oracle для .net).

Допустим, у вас есть 2 Oracle хранимых функций, как это:

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; 

Одна из функций возвращают VARCHAR2 и другие возвращает réf курсора. На VB стороны, вы можете сделать это:

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 
5
' 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 
+1

Я еще не пробовал, но * указание ** результата ** должно быть первым параметром * определенно выглядит как мелкая деталь, которая может иметь наибольшее значение :) – void