来自普通SQL的Oracle sys_refcursor

时间:2012-05-18 15:23:45

标签: 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参数中返回的数据中填充.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,但我无法创建函数或过程。 这可能吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

select cursor(select * from dual) from dual;