【问题标题】:How do I call Oracle function in c# which takes parameters and return records?如何在 c# 中调用带有参数并返回记录的 Oracle 函数?
【发布时间】:2018-05-10 01:03:12
【问题描述】:

我有一个 Oracle 函数,它接受 3 个参数并返回有四列的记录。

但是我遇到了一个例外

ORA-06550:第 1 行,第 7 列:
PLS-00221:“get_receipts”不是过程或未定义

这是我的代码:

OracleConnection con = new OracleConnection(oracleDB);
con.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = con;

cmd.CommandText = "get_receipts";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new OracleParameter("p_store_num", store_num));
cmd.Parameters.Add(new OracleParameter("p_create_dt", create_date));
cmd.Parameters.Add(new OracleParameter("p_cc_last4", cc_last4));

OracleDataReader dr = cmd.ExecuteReader();

while (dr.Read())
{
    ResponseModel sample = new ResponseModel();

    sample.Field1 = dr.GetString(0);
    sample.Field2 = dr.GetString(1);
    sample.Field3 = dr.GetString(2);
    sample.Field4 = dr.GetString(3);

    response.Add(sample);
}

【问题讨论】:

标签: c# oracle stored-procedures oracle-manageddataaccess


【解决方案1】:

对于 oracle 来说有点棘手

您必须将结果集作为 ref_cursor 类型从您的过程中返回

看看这个

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/oracle-ref-cursors

【讨论】:

  • cmd.Parameters.Add(new OracleParameter("o_return_cur", OracleDbType.RefCursor,int.MaxValue,ParameterDirection.Output));在那里传递最大 int 大小是否很好?我的存储过程返回记录集。请指导我解决此问题的最佳做法。
  • 老实说我不确定。这是一个 oracle 文档,它使用 DBNull.Value 而不是 int.MaxValue,试试看? docs.oracle.com/cd/B28359_01/win.111/b28375/featRefCursor.htm
  • 我试过了,效果很好。当我也使用 int max 时它也起作用了。但我要和这个一起去。谢谢楼主
【解决方案2】:

如果这是关于表格函数的,我会尝试编写一个查询,它使用该函数作为唯一的数据源并检索查询结果。

编辑: 它会是这样的(未经测试):

SELECT *
  FROM TABLE(get_receipts(:p_store_num, :p_create_dt, :p_cc_last4))

【讨论】:

  • 谢谢先生。。我后来请我的同事把它改成存储程序。现在我的代码正在工作,因为我处理了参考光标。请检查我上面的评论。但我还是有些怀疑。您可以查看我对彼得帖子的评论。
猜你喜欢
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多