从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/…cur
是 cursor
而不是 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 返回的游标中进行选择