我想弄清楚是否可以避免使用游标来迭代 PL/SQL 中的表行,并尝试了以下脚本:
set serveroutput on;
declare
v1 tbl_plant.plant_id%type := 0; -- number(10,0)
v2 tbl_plant.name%type := ''; -- varchar2(50)
begin
while true
loop
select plant_id, name
into v1, v2
from tbl_plant
where rownum = 1
and plant_id > v1
order by plant_id;
exit when sql%rownum = 0;
dbms_output.put_line(v1 || v2);
end loop;
end;
所以我认为编译器在while
使用循环时将其优化为隐式游标,并试图规避:
set serveroutput on;
declare
v1 tbl_plant.plant_id%type := 0;
v2 tbl_plant.name%type := '';
begin
<<divein>>
select plant_id, name
into v1, v2
from tbl_plant
where rownum = 1
and plant_id > v1
order by plant_id;
if sql%rownum = 0 then
goto bailout;
end if;
dbms_output.put_line(v1 || v2);
goto divein;
<<bailout>>
null;
end;
但在这两种情况下,我都得到了完全相同的错误:
PLS-00207: identifier 'ROWNUM', applied to implicit cursor SQL, is not a legal cursor attribute
但是,如果我注释掉while
orgoto
和标签,消除任一类型的循环,相同的选择工作正常,并按tbl_plant
植物 ID 返回第一个 ID/名称。
是否可以使用游标进行迭代?
有效的游标属性名称是
%NOTFOUND
,%FOUND
,%ROWCOUNT
,之一%ISOPEN
。没有%rownum
属性。在您的问题中,您使用隐式游标,因此应该是sql%rowcount
.