1. 程式人生 > >動態遊標的寫法

動態遊標的寫法

在變數宣告部分定義的遊標是靜態的,不能在程式執行過程中修改。雖然可以通過引數傳遞來取得不同的資料,但還是有很大的侷限性。通過採用動態遊標,可以在程式執行階段隨時生成一個查詢語句作為遊標。要使用動態遊標需要先定義一個遊標型別,然後宣告一個遊標變數,遊標對應的查詢語句可以在程式的執行過程中動態地說明。
定義遊標型別的語句如下:
TYPE 遊標型別名 REF CURSOR;
宣告遊標變數的語句如下:
遊標變數名 遊標型別名;
在可執行部分可以如下形式開啟一個動態遊標:
OPEN 遊標變數名 FOR 查詢語句字串;

輸入並執行以下程式:

Sql程式碼 複製程式碼
  1. declare
  2.  type cur_type 
    is ref cursor;   
  3.  cur cur_type;   
  4.  rec scott.emp%rowtype;   
  5.  str varchar2(50);   
  6.  letter char:= 'A';   
  7. begin
  8.         loop           
  9.          str:= 'select ename from emp where ename like ''%'||letter||'%''';   
  10. open cur for str;   
  11.          dbms_output.put_line('包含字母'||letter||'的名字:');   
  12.           loop   
  13. fetch cur into rec.ename;   
  14.          exit when cur%notfound;   
  15.         dbms_output.put_line(rec.ename);   
  16. end loop;   
  17.   exit when letter='Z';   
  18.   letter:=chr(ascii(letter)+1);   
  19. end loop;   
  20. end;  

遊標屬性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 :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語句執行時開啟,結束時就立即關閉。