4

나는 Oracle 데이터베이스에 연결하기 위해 ado를 사용하는 vb.net 코드베이스를 가지고 있습니다. 우리는 호출하는 저장 프로 시저가 많이 있으며, 일부는 여러 개의 out 매개 변수가 있습니다. 그러나 이제는 저장된 함수를 호출해야하며 함수의 결과를 내 VB 코드로 다시 가져 오는 방법은 분명하지 않습니다.ado.net에서 Oracle 저장 함수를 호출하고 결과를 얻는 올바른 방법은 무엇입니까?

편집 : 정수를 반환합니다.

올바르게 ado.net에서 oracle stored 함수를 호출하려면 어떻게해야합니까?

+0

함수 반환을 무엇? – dcp

답변

7

ODP.net (.net 용 기본 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 반환하고 다른 반환 커서를 심판 :

의 당신이 추천 Oracle 저장 기능을 가지고 있다고 가정 해 봅시다. 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

관련 문제