28.PLSQL中的顯式遊標

        在上一文中,介紹了PLSQL中的隱式遊標的用法,本文主要介紹另外一種遊標的使用——顯式遊標。

一、顯式遊標聲明和屬性

1.1 顯式遊標的聲明

        所謂顯式遊標,就是我們在PLSQL的聲明區,顯式的去聲明的遊標,它在聲明時已經綁定的SQL語句,將會管理該SQL語句返回的結果集,其聲明格式如下:
cursor 遊標名稱  is SQL語句
        如果聲明一個管理emp表查詢結果集的遊標cur_emp:
cursor cur_emp is select * from emp;

        定義好顯示遊標之後,我們在使用遊標時要先進行Open:

open 遊標名稱
        打開之後如果想要取出遊標所指的數據行,使用fetch...into...

fetch 遊標名 into 對象名

1.2 顯式遊標的屬性

        和隱式遊標類似,顯式遊標也包含四個屬性,如下表所示:
序號 屬性 描述
1 %found         遊標被打開後,如果沒有執行過fetch,返回null;如果在最近的一次fetch中返回一行,則返回True,否則返回False
2 %isopen           遊標是打開狀態返回True,否則爲False
3 %notfound             遊標被打開後,如果沒有執行過fetch,返回null;如果在最近的一次fetch中返回一行,則返回False,否則返回True
4 %rowcount                 其值爲該遊標在執行fetch語句所返回的行數。遊標打開時,其初始化爲0;遊標每fetch一行數據,其將會在原來的基礎之上加1.

1.3 利用遊標顯示查詢結果

        假設有下表emp,我們想要打印中emp表中所有的人員的信息。如果在之前,可能需要將查詢結果bulk collect into一個索引表中或者數組中,而同樣可以使用遊標來完成這個功能:
        
declare
  cursor cur_emp is select * from emp;
  var_emp emp%rowtype;
begin
  if cur_emp%isopen then --先判斷遊標是否已經打開
    null;
  else
    open cur_emp; --遊標已經打開
  end if;
  
  fetch cur_emp into var_emp; --先要fetch遊標一行數據給var_emp,以保證cur_emp%found爲true
  
  while cur_emp%found loop --採用while循環獲取遊標中的數據  
    dbms_output.put_line('姓名:'||var_emp.ename||',薪資:'||var_emp.sal); --打印獲取的數據
    fetch cur_emp into var_emp; --再次獲取
  end loop;
  close cur_emp;
end;
/
       結果如下:
        在上面的例子中,我們利用遊標獲取了select的數據集,並使用while循環將數據集進行了打印,我們總結下這個過程:
(1)在PLSQL的聲明區聲明遊標。
(2)先利用%isopen判斷遊標的打開狀態,如果遊標沒有打開,則需要open遊標。
(3)fetch一行遊標指向的第一行數據,以保證%found返回的結果爲True。
(4)利用while循環逐行讀取和顯示fetch來的數據。
        上述是我們使用遊標的一般步驟,但是在通常情況下,我們都是利用for循環來處理遊標管理的數據,因爲在for循環中,第2、3步驟會自動由for循環完成,使整個過程得到極大的簡化,如下所示:
declare
  cursor cur_emp is select * from emp;
begin 
  for var_emp in cur_emp loop
    dbms_output.put_line('姓名:'||var_emp.ename||',薪資:'||var_emp.sal); --打印獲取的數據
  end loop;
end;
/

1.4 利用遊標更新數據

        處理利用遊標可以實現管理select語句的結果集之外,我們還可以利用遊標來更新數據庫裏面的數據,如下面的代碼,更新每個sal小於2000的僱員的sal爲2000:

declare
  cursor cur_emp is select * from emp where sal<2000;
begin
  for var_emp in cur_emp loop
    update emp set sal=2000 where emp.sal=var_emp.sal;
  end loop;
end;
/
        上述是利用遊標查詢查詢出來的數據,直接在表中進行更新,我們也可以通過遊標的For update of和where current of子句間接的更新表
declare
  cursor cur_emp is select * from emp where sal<2000 for update of sal;
begin
  for var_emp in cur_emp loop
    update emp set sal=2000 where current of cur_emp;
  end loop;
end;
/
        for update of子句在定義遊標時使用,用來表明需要更新哪些字段,而where current of 後面直接加遊標名,表明遊標現在所在行,通過對上述兩個子句的調用,我們也可以達到上述修改表格數據的目的。

二、帶參遊標的使用

        在上面的例子中,我們聲明並使用了普通的遊標用來顯示或更新數據表,遊標也可以聲明成帶參數的形式,比如下面的例子,我們聲明瞭一個帶參的遊標,執行時由用戶手動輸入參數,用來指定獲取僱員的部門,最終打印這些僱員信息:
declare
  cursor cur_emp(v_dept emp.deptno%type) is select * from emp where deptno=v_dept;
begin
  for var_emp in cur_emp(&v_dept) loop
    dbms_output.put_line('姓名:'||var_emp.ename||',薪資:'||var_emp.sal); --打印獲取的數據
  end loop;
end;
/







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