C# Oracle sys_refcursor来自普通SQL

C# Oracle sys_refcursor来自普通SQL,c#,.net,oracle,plsql,sys-refcursor,C#,.net,Oracle,Plsql,Sys Refcursor,我有一个(简化的)Oracle SQL,如下所示: declare xd number; xm number; DataOut sys_refcursor; begin xd := to_number(to_char(sysdate, 'dd')); xm := to_number(to_char(sysdate, 'mm')); open DataOut for select * from dual; end; 我希望能够从DataOut参数中返回的数据填充

我有一个(简化的)Oracle SQL,如下所示:

declare
  xd number;
  xm number;
  DataOut sys_refcursor;
begin
  xd := to_number(to_char(sysdate, 'dd'));
  xm := to_number(to_char(sysdate, 'mm'));

  open DataOut for
  select * from dual;  
end;
我希望能够从DataOut参数中返回的数据填充.Net中的DataTable

我一直在尝试各种方法,但似乎无法访问DataOut游标。 我怎么称呼这个

OracleCommand c = new OracleCommand();
c.CommandType = CommandType.Text;
c.CommandText = SQL;

OracleParameter param = new OracleParameter();
param.Direction = ParameterDirection.Output;
param.OracleType = OracleType.Cursor;
param.ParameterName = "DataOut";
c.Parameters.Add(param);

c.Connection = (OracleConnection) this.GetConnection();

OracleString rowNum = "";
c.ExecuteOracleNonQuery(out rowNum);
// or c.ExecuteReader()
// or use OracleDataAdapter

DataTable returnTable = /* magic goes here */
我可以编辑SQL,但不能创建函数或过程。
这可能吗?

匿名PL/SQL块不会返回任何内容,因此您将无法在客户端应用程序中使用在匿名PL/SQL块中打开的游标。为了将数据返回到客户端应用程序,需要使用命名的PL/SQL块(即存储过程或存储函数)。如果不允许创建命名的PL/SQL块,则无法将在PL/SQL中打开的游标返回到客户端应用程序。

您的示例简化得太多了吗?你知道PL/SQL块不会返回任何东西,对吗?我不是Oracle的人,但我的客户给我发送了这个示例,告诉我应该能够从DataOut变量中获取数据。我可以将它更改为返回值吗?我该怎么做?谢谢:)我真的迷路了!非常感谢。但是,我是否可以以某种方式解决这个问题,有没有一种方法可以在不使用命名过程的情况下从sys_refcursor到.Net获取某些内容。例如,从中选择?@GunnarSteinn-No.A
sys\u refcursor
是PL/SQL构造,而不是SQL构造。它只能在PL/SQL块中声明。并且,只有当PL/SQL块返回的东西只有在能够声明参数和返回的命名PL/SQL块中才可能出现时,它才能返回给调用方。当然,您可以在.Net应用程序的PL/SQL块中构造任何SQL语句,然后从.Net执行该SQL语句,完全不需要PL/SQL。
select cursor(select * from dual) from dual;