[英]Procedure with out parameter (SYS_REFCURSOR) with Entity Framework
[英]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.