Oracle-10g
不使用游標就不可能在 Oracle PL/SQL 中迭代表行嗎?
我想弄清楚是否可以避免使用游標來迭代 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
.