2009-11-20 25 views
4

我有一个使用ado连接到Oracle数据库的vb.net代码库。我们有很多我们所称的存储过程,其中一些有多个输出参数。但是,我现在需要调用一个存储函数,并且我不清楚如何将函数的结果返回到我的VB代码中。从ado.net调用Oracle存储函数并获取结果的正确方法是什么?

编辑:我正在返回一个整数。

如何正确调用ado.net的oracle存储函数?

+0

什么是函数的返回? – dcp 2009-11-20 22:09:31

回答

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和其他回报REF光标。在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 2010-12-18 20:19:04

相关问题