【问题标题】:How to call Oracle stored procedure which accepts RefCursor as out parameter using Entity Framework如何使用实体框架调用接受 RefCursor 作为输出参数的 Oracle 存储过程
【发布时间】:2019-08-01 07:41:51
【问题描述】:

我有一个 Oracle 存储过程,它接受多个 RefCursor 类型的输出参数(代码如下)。

create or replace 
    PROCEDURE PROCEDURE1(
    lookupvalues out SYS_REFCURSOR,
    lookupvalues1 out SYS_REFCURSOR)
AS 
BEGIN
    open lookupvalues for
    select attribute3 from table1 where attribute3 is not null;
    open lookupvalues1 for 
    select attribute1 from table2 where attribute1 is not null;
END PROCEDURE1;

我只需要使用 c# 和 Entity Framework 将这些 out 参数的结果作为数据集获取。

我能够获取数据,但我认为这不是一个体面的方法。

我想使用实体框架来检索数据(如果可能的话)。

using (APWCContext dbcontext = new APWCContext())
{
    using (var cmd = dbcontext.Database.Connection.CreateCommand())
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "PROCEDURE1";

        var businessUnit = new OracleParameter("lookupvalues", OracleDbType.RefCursor, ParameterDirection.Output);
        var currency = new OracleParameter("lookupvalues1", OracleDbType.RefCursor, ParameterDirection.Output);
        cmd.Parameters.AddRange(new[] { businessUnit,currency});                              
        cmd.Connection.Open();                    
        var reader= cmd.ExecuteReader();
        DataTable budt = new DataTable();                   
        while (reader.Read())
        {
            budt.Load(reader);
        }                                        
        var data = businessUnit.Value;                                                     
        cmd.Connection.Close();
    }
    //var businessUnit = new OracleParameter("lookupvalues", OracleDbType.RefCursor, ParameterDirection.Output);
    var r = dbcontext.GOODWILL_HEADER_STG.FirstOrDefault();

    //var result = dbcontext.Database.ExecuteSqlCommand("BEGIN PROCEDURE1(:lookupvalues); END;", businessUnit);
}

【问题讨论】:

  • “我认为这不是一个体面的方法” 你这是什么意思?您希望我们提供什么帮助?
  • 我的意思是当数据表被填充时,首先将第一个引用游标返回的值添加到数据表的第一列,然后在下一次读取之后,将值从另一个游标复制到另一列数据表,但从第一列结束的索引开始..
  • 抱歉,目前还不清楚。如果您发布一些示例数据(table1table2 的值)以及从该示例派生的所需输出,将会有所帮助。
  • 好的,但是根据您的说法,访问引用光标值的方法是否正确?
  • 对于“正确”的某些值。您正在以语法正确的方式调用 ref 游标。但它是否逻辑上正确取决于你想要达到的目标。

标签: c# oracle entity-framework asp.net-web-api2 odp.net


【解决方案1】:

在不完全了解您的要求范围的情况下,您的程序似乎没有必要。另一个问题可能是您为什么要使用实体框架?

请参阅此处引用的答案:

Returning datatable using entity framework

你只需要定义你的实体表table1一次,然后使用Linq提取信息。

查看从链接答案中提取的修改代码:

DataTable dt = new DataTable();
(from a1 in context.Table1.Where(i => i.Attribute3 != "").AsEnumerable()
 from a2 in context.Table1.Where(i => i.Attribute1 != "").AsEnumerable()
   select new
          {
            Attribute = a2.Attribute1 ?? a1.Attribute3
            //etc
          }).Aggregate(table, (dt, r) =>
          {
            dt.Rows.Add(r.Attribute);
            return dt;
          });

【讨论】:

  • 我需要查询的表不是我拥有的架构的一部分,它在其他架构中,这就是使用存储过程的原因。并使用 RefCursor 因为我需要将返回的结果作为数据集,如果我在这里做错了什么,请告诉我。
猜你喜欢
  • 2016-12-26
  • 2023-04-08
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
相关资源
最近更新 更多