gpt4 book ai didi

plsql - PL SQL For 循环 Sys_RefCursor

转载 作者:行者123 更新时间:2023-12-03 18:30:06 25 4
gpt4 key购买 nike

我正在使用 Oracle 12c。在 PL/SQL 我可以做到这一点

set serveroutput on
declare
begin
for x in (select 1 as y from dual) loop
dbms_output.put_line(x.y);
end loop;
end;

这个我也可以...
set serveroutput on
declare
cursor c1 is
select 1 as y from dual;
begin
for x in c1 loop
dbms_output.put_line(x.y);
end loop;
end;

到现在为止还挺好。但是我可以用 sys_refcursor 做到这一点吗?我知道我可以用 fetch/while 循环来做,但更喜欢 for 循环语法(我认为它更干净)......
set serveroutput on
declare
cur sys_refcursor;
begin
cur := Package.GetData(1234);
fetch cur into y;
while cur%FOUND loop
dbms_output.put_line(y);
fetch cur into y;
end loop;
end;

我想要做...
set serveroutput on
declare
cur sys_refcursor;
begin
cur := PACKAGE.GetData(1234); -- This returns a sys_refcursor
for x in cur loop
dbms_output.put_line(x.y);
end loop;
end;

Error report -
ORA-06550: line 5, column 16:
PLS-00221: 'cur' is not a procedure or is undefined

是否有通过 sys_refcursor 循环的机制(而不是 fetch into/while 循环)?也许 12c 中有一些我不知道的新奇事物......?

最佳答案

SYS_REFCURSOR只是一个预先声明的弱引用游标。没有这样的机制来循环 sys_refcursor不取。此外,您不能将弱 refcursor 与普通游标进行比较,它们的工作方式不同。它是一个缓冲区空间,用于临时保存结果。当您在 PLSQL 中运行以下语句时块,PLSQL引擎不明白 PLSQL变量并抛出错误

for x in cur loop


PLS-00221: 'CUR' is not a procedure or is undefined

除了以下语句也将失败,因为您没有定义 OUT如果它重新返回 SYS_REFCURSOR,则将参数添加到包中.

cur := PACKAGE.GetData(1234);



您可以获取 SYS_REFCURSOR 的内容然后显示如下:
declare
a SYS_REFCURSOR;
v_emp_id employee.emp_id%type;
begin
--- This is a procedure with OUT parameter as SYS_REFCURSOR
dynmc_selec(emp_output=>a);

loop
FETCH a INTO v_emp_id;
EXIT WHEN a%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_emp_id );

end loop;
end;

关于plsql - PL SQL For 循环 Sys_RefCursor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42698175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com