从Oracle中的函数返回游标

Posted

技术标签:

【中文标题】从Oracle中的函数返回游标【英文标题】:Returning cursor from function in 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

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

【问题讨论】:

您不能使用独立函数来执行此操作,您需要创建一个表类型和一个表函数。看看docs.oracle.com/cd/E11882_01/appdev.112/e10765/… curcursor 而不是 sys_refcursor。您需要将变量声明为cur sys_refcursor,然后使用open cur for select * from dual @a_horse_with_no_name Oracle 版本:12c 标准版,12.1.0.2.0 Function return sys_refcursor call from sql with specific columns的可能重复 【参考方案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 的嵌套表类型;

【讨论】:

以上是关于从Oracle中的函数返回游标的主要内容,如果未能解决你的问题,请参考以下文章

如何从从 plsql 函数 ORACLE 返回的游标中进行选择

调用返回游标的 oracle 函数

从存储的函数返回更新的行

使用 JDBC 从存储过程中获取 Oracle 表类型

如何从 Oracle 过程返回填充了 NESTED RECORD 类型的游标

将多个引用游标从 Oracle 过程返回到 Java