PL/SQL-遊標

遊標,可認爲是“移動的指針”,指向一個查詢結果的某一行,然後通過PL/SQL程序對該行數據進行特定操作。由於遊標每次只能讀取一行數據,對於多條記錄,需要反覆讀取,直到遊標讀取不到數據爲止。
在這裏只介紹兩種遊標:

  • 顯式遊標:由用戶聲明和操作的遊標,通常用於操作結果集。
  • 隱式遊標:在執行SQL語句時,由Oracle自動創建。

顯式遊標

問題
在emp表中,輸出"ename的編號是empno,工資是sal"。
分析
emp表中有14條記錄,則該問題輸出14行。每一行格式都是"ename的編號是empno,工資是sal",要使用多行數據進行輸出。
步驟

  • 聲明遊標【declare】
  cursor emp_cur(emp_job in varchar2:='SALESMAN')  --聲明遊標和對應的結果集
  is select empno,ename,sal from emp where job=emp_job;
  • 打開遊標【begin】
open emp_cur('MANAGER');  --打開遊標
  • 讀取遊標【begin】
fetch emp_cur into var_emp;  --指向第一行

再執行一次,則指向下一行。

  • 關閉遊標【begin】
close emp_cur;  --關閉遊標

例子

-- ename的編號是empno,工資是sal
set serveroutput on
declare
  cursor emp_cur(emp_job in varchar2:='SALESMAN')  --聲明遊標和對應的結果集
  is select empno,ename,sal from emp where job=emp_job;
  type emp_record is record(   --構造一個record類型
  var_empno emp.empno%type,
  var_ename emp.ename%type,
  var_sal emp.sal%type
  );
  var_emp emp_record;   --聲明一個record類型的變量
begin
  open emp_cur('MANAGER');  --打開遊標
  fetch emp_cur into var_emp;  --指向第一行
  while emp_cur%found loop   -- emp_cur%found:判斷指針指向的行是否有數據,有的話返回true,沒有的話返回false
    dbms_output.put_line(var_emp.var_ename||'的編號是'||var_emp.var_empno||',工資是'||var_emp.var_sal);
    fetch emp_cur into var_emp;    --指向下一行
  end loop;
  close emp_cur;  --關閉遊標
end;
/

顯式遊標的屬性

  • %found【cursor%found 遊標所指數據行有數據,則返回true,無數據則返回false】【boolean】
  • %notfound【與%found相反】【boolean】
  • %rowcount【返回受sql語句影響的行數】【int】
  • %isopen【遊標打開則爲true,遊標關閉則爲false】【boolean】
dbms_output.put_line('遊標emp_cur所對應的結果集有'||emp_cur%rowcount||'行。');

隱式遊標

隱式遊標無需聲明、打開、讀取、關閉,可直接使用其屬性。
在PL/SQL編程中,常用於反映update和delete所影響的數據行的情況。
該隱式遊標所對應的結果集爲最近的一個sql的結果集。

set serveroutput on
begin
  update emp set sal=sal*1.2 where job='MANAGER';  --3行數據行被更新
  if sql%notfound then
    dbms_output.put_line('沒有員工需要漲工資');
  else
    dbms_output.put_line('有'||sql%rowcount||'個員工工資上漲20%');
  end if;
end;
/

隱式遊標的屬性

隱式遊標默認遊標名爲sql

  • %found【sql%found 遊標所指數據行有數據,則返回true,無數據則返回false】【boolean】
  • %notfound【sql%notfound 與%found相反】【boolean】
  • %rowcount【sql%rowcount 返回受sql語句影響的行數】【int】
  • %isopen【sql%isopen 遊標打開則爲true,遊標關閉則爲false】【boolean】

總結

上述講了這麼多,最主要是要知道什麼時候才需要使用遊標。即當需要反覆讀取一個數據集進行輸出時,要使用遊標。

發佈了26 篇原創文章 · 獲贊 17 · 訪問量 7578
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章