【问题标题】:Oracle sys_refcursor from normal SQL来自普通 SQL 的 Oracle sys_refcursor
【发布时间】:2012-05-26 04:36:03
【问题描述】:

我有一个像这样的(简化的)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 块没有返回任何东西吗?
  • 好吧,我不是 Oracle 人员,但我的客户将此示例发送给我,并告诉我应该能够从 DataOut 变量中获取数据。
  • 我可以将其更改为返回值吗?我该怎么做?谢谢 :) 我真的迷路了!

标签: c# .net oracle plsql sys-refcursor


【解决方案1】:

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

【讨论】:

  • 非常感谢。但是我能以某种方式解决这个问题吗,有没有办法在没有命名过程的情况下从 sys_refcursor 到 .Net 获取一些东西。例如从中选择?
  • @GunnarSteinn - 否。sys_refcursor 是 PL/SQL 构造,而不是 SQL 构造。它只能在 PL/SQL 块中声明。并且只有当 PL/SQL 块返回一些只有可以声明参数和返回的命名 PL/SQL 块才有可能的东西时,它才能返回给调用者。当然,您可以在 .Net 应用程序的 PL/SQL 块中构造任何 SQL 语句,然后从 .Net 执行该 SQL 语句,完全绕过对 PL/SQL 的需求。
【解决方案2】:
select cursor(select * from dual) from dual;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 2016-10-25
    • 2015-07-06
    • 1970-01-01
    • 2019-01-08
    • 2016-10-17
    • 1970-01-01
    相关资源
    最近更新 更多