繁体   English   中英

如何使用实体框架调用接受 RefCursor 作为输出参数的 Oracle 存储过程

[英]How to call Oracle stored procedure which accepts RefCursor as out parameter using Entity Framework

我有一个 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# 和实体框架将这些 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);
}

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

请参阅此处引用的答案:

使用实体框架返回数据表

您只需要定义您的实体表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;
          });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM