Oracle 儲存過程中的迴圈語句寫法
阿新 • • 發佈:2019-01-11
首先科普一下:
oracle 遊標屬性 sql%found sql%notfound sql%rowcount
當執行一條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 ELETE和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語句執行時開啟,結束時就立即關閉。
==============
言歸正傳,一般我們編寫儲存過程用到遊標迴圈的話,可以這麼寫:
Sql程式碼
for語句直接幫我們做了遊標的開啟關閉,以及判斷工作。
我們也可以換一種寫法:
Sql程式碼
根據遊標的特點,這兩種迴圈的寫法是等效的。
補充一點,遊標預設開啟是隻讀遊標,如果要在用到遊標的時候修改遊標中的值,需要在遊標定義的時候,加上For update語句。
oracle 遊標屬性 sql%found sql%notfound sql%rowcount
當執行一條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
. 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語句執行時開啟,結束時就立即關閉。
==============
言歸正傳,一般我們編寫儲存過程用到遊標迴圈的話,可以這麼寫:
Sql程式碼
- 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語句直接幫我們做了遊標的開啟關閉,以及判斷工作。
我們也可以換一種寫法:
Sql程式碼
- 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語句。