Oracle 存儲過程中的循環語句寫法

資料來源:http://liliangjie.iteye.com/blog/812771
首先科普一下: 
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 

  . TRUEELETE和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代碼  收藏代碼
  1. declare  
  2. cursor cur is   
  3.         select * from iss2_foc_response;  
  4. raw_row iss2_foc_response%rowtype;  
  5. begin  
  6.       for raw_row in cur  
  7.       loop  
  8.           dbms_output.put_line('test');  
  9.       end loop;  
  10. end;  

for語句直接幫我們做了遊標的打開關閉,以及判斷工作。 

我們也可以換一種寫法: 

Sql代碼  收藏代碼
  1. declare  
  2. cursor cur is   
  3.         select * from iss2_foc_response;  
  4. raw_row iss2_foc_response%rowtype;  
  5. begin  
  6.       open cur;  
  7.       FETCH cur   
  8.        into raw_row;  
  9.       while cur%found  
  10.       loop  
  11.             dbms_output.put_line('test while');  
  12.             FETCH cur   
  13.              into raw_row;  
  14.       end loop;  
  15.       close cur;  
  16. end;  

根據遊標的特點,這兩種循環的寫法是等效的。 

補充一點,遊標默認打開是隻讀遊標,如果要在用到遊標的時候修改遊標中的值,需要在遊標定義的時候,加上For update語句。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章