【问题标题】:Returning cursor from function in Oracle从Oracle中的函数返回游标
【发布时间】:2016-11-20 18:18:43
【问题描述】:

我想做的是从函数返回结果,所以函数可以通过以下方式使用: select * from stuff(1)

简化函数示例:

FUNCTION stuff(p_var number) RETURN SYS_REFCURSOR
IS

CURSOR cur(cp_var number) IS
    SELECT * FROM dual ;

BEGIN
    OPEN cur(p_var);
    RETURN cur;
END stuff;

但这不能编译: Error: PLS-00382: expression is of wrong type

是否可以从以这种方式定义的函数返回光标/结果?

【问题讨论】:

标签: oracle plsql


【解决方案1】:

您的函数返回一个sys_refcursor,而在您的代码中,您返回一个simple cursor。这使得代码错误。如果你想从一个函数返回一个ref_cursor,你可以使用如下:

create or replace function stuff (p_var number)
   return sys_refcursor
is
   rf_cur   sys_refcursor;
begin
   open rf_cur for
      select *
        from employee
       where employee_id = p_var;

   return rf_cur;
end stuff;

执行:

select stuff(1) from dual;

【讨论】:

  • 请注意,这不会像预期的那样返回行和列。所以你需要解压返回的结果。
  • 是的,当然,你的结果集是一个集合,然后你需要解压才能看到每一列。
【解决方案2】:

你需要创建管道内衬表函数,这里有一篇文章可以帮助你。

https://oracle-base.com/articles/misc/pipelined-table-functions

【讨论】:

    【解决方案3】:

    我认为你不能直接在 FROM 子句中调用引用游标,但是你可以尝试跟随..

    SELECT * FROM TABLE(function_name());

    函数的返回类型应为 PLSQL 嵌套表 创建 CURSOR%ROWTYPE 的嵌套表类型;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      相关资源
      最近更新 更多