gpt4 book ai didi

oracle - 从 ado.net 调用 Oracle 存储函数并获取结果的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-03 02:34:04 26 4
gpt4 key购买 nike

我有一个使用 ado 连接到 Oracle 数据库的 vb.net 代码库。我们有很多调用的存储过程,其中一些带有多个输出参数。但是,我现在需要调用一个存储函数,但我不清楚如何将该函数的结果返回到我的 VB 代码中。

编辑:我返回一个整数。

如何从 ado.net 正确调用 Oracle 存储函数?

最佳答案

我假设您使用的是 ODP.net(.net 的 native Oracle 客户端)。

假设您有 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,另一个返回引用游标。在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

关于oracle - 从 ado.net 调用 Oracle 存储函数并获取结果的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1773534/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com