Oracle 儲存過程中的迴圈語句寫法

2021-08-31 02:07:51 字數 1725 閱讀 4448

首先科普一下:

[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 ...