1. 程式人生 > >Oracle 儲存過程中的迴圈語句寫法

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

首先科普一下: 
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程式碼  收藏程式碼
  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語句。