首先科普一下:
[color=red]oracle 游標屬性 sql%found sql%notfound sql%rowcount[/color]
當執行一條dml語句後,dml語句的結果儲存在四個游標屬性中,這些屬性用於控制程式流程或者了解程式的狀態。當執行dml語句時,pl/sql開啟乙個內建游標並處理結果,游標是維護查詢結果的記憶體中的乙個區域,游標在執行dml語句時開啟,完成後關閉。隱式游標只使用 sql%found,sql%notfound,sql%rowcount三個屬性.sql%found,sql%notfound是布林值,sql%rowcount是整數值。
sql%found和sql%notfound
在執行任何dml語句前 sql%found和sql%notfound的值都是null,在執行dml語句後,sql%found的屬性值將是:
. true :insert
. true :delete和update,至少有一行被delete或update.
. true :select into至少返回一行
當sql%found為true時,sql%notfound為false。
sql%rowcount
在執行任何dml語句之前,sql%rowcount的值都是null,對於select into語句,如果執行成功,sql%rowcount的值為1,如果沒有成功,sql%rowcount的值為0,同時產生乙個異常 no_data_found.
sql%isopen
sql%isopen是乙個布林值,如果游標開啟,則為 true, 如果游標關閉,則為false.對於隱式游標而言sql%isopen總是false,這是因為隱式游標在dml語句執行時開啟,結束時就立即關閉。
**********====
言歸正傳,一般我們編寫儲存過程用到游標迴圈的話,可以這麼寫:
declare
cursor cur is
select * from iss2_foc_response;
raw_row iss2_foc_response%rowtype;
begin
for raw_row in cur
loop
dbms_output.put_line('test');
end loop;
end;
for語句直接幫我們做了游標的開啟關閉,以及判斷工作。
我們也可以換一種寫法:
declare
cursor cur is
select * from iss2_foc_response;
raw_row iss2_foc_response%rowtype;
begin
open cur;
fetch cur
into raw_row;
while cur%found
loop
dbms_output.put_line('test while');
fetch cur
into raw_row;
end loop;
close cur;
end;
根據游標的特點,這兩種迴圈的寫法是等效的。
補充一點,游標預設開啟是唯讀游標,如果要在用到游標的時候修改游標中的值,需要在游標定義的時候,加上for update語句。
oracle學習 PL SQL 儲存過程中迴圈
pl spl 提供了3中不同型別的迴圈結構 例項 索引 loop counter從1開始,到10 結束,迴圈共執行10次 for loop counter in 1 10 loop 可執行語句.endloop 索引loop counter從10開始,到1結束,迴圈共執行10次 for loop co...
Oracle儲存過程中跳出迴圈的寫法
記錄exit和return的用法 exit用來跳出迴圈 loop if v kbp is null then exit end if end loop return跳出儲存過程 loop if v kbp is null then return end if end loop 跳出loop 一次迴圈...
Oracle儲存過程中跳出迴圈的寫法
注 本文 於 oracle儲存過程中跳出迴圈的寫法 記錄exit和return的用法 1 loop 2if v kbp is null then 3exit 4end if 5 end loop 1 loop 2if v kbp is null then 3return 4end if 5 end ...