Oracle-10g

不使用游標就不可能在 Oracle PL/SQL 中迭代表行嗎?

  • October 10, 2014

我想弄清楚是否可以避免使用游標來迭代 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

但是,如果我註釋掉whileorgoto和標籤,消除任一類型的循環,相同的選擇工作正常,並按tbl_plant植物 ID 返回第一個 ID/名稱。

是否可以使用游標進行迭代?

有效的游標屬性名稱是 %NOTFOUND, %FOUND, %ROWCOUNT,之一%ISOPEN。沒有%rownum屬性。在您的問題中,您使用隱式游標,因此應該是 sql%rowcount.

引用自:https://dba.stackexchange.com/questions/78823