首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

PL/SQL 顯式游標完整教學:宣告、開啟、擷取、關閉與屬性應用

     編輯:Oracle 資料庫基礎

什麼是游標

Oracle 為每個 SQL 陳述式隱式建立游標。顯式游標由開發者命名、定義,用於處理 SELECT 回傳的多列結果集 (Active Set),提供指標逐列處理能力。

顯式游標四步驟

  1. DECLARE:在宣告區定義游標名稱與查詢。
  2. OPEN:執行查詢、識別結果集、指標指向第一列。
  3. FETCH:逐列取值至 PL/SQL 變數,指標前移。
  4. CLOSE:釋放結果集、關閉游標。

語法與範例

1. 宣告 (可帶參數)

DECLARE
  CURSOR c1 IS
    SELECT view_name FROM all_views WHERE rownum <= 10 ORDER BY view_name;
  -- 帶參數版
  CURSOR c2 (p_limit NUMBER) IS
    SELECT view_name FROM all_views WHERE rownum <= p_limit;
  v_name VARCHAR2(40);
BEGIN
  ...

參數僅在游標範圍內可見,外部引用會報錯。

2. 開啟

OPEN c1;
-- 或 OPEN c2(5);

開啟後結果集靜態化,後續 DML 不影響已開啟游標;需重新開啟才刷新。

3. 擷取與迴圈處理

FETCH c1 INTO v_name;
WHILE c1%FOUND LOOP
  DBMS_OUTPUT.PUT_LINE(c1%ROWCOUNT || ' ' || v_name);
  FETCH c1 INTO v_name;
END LOOP;

4. 關鍵屬性

屬性型別含義
%FOUNDBOOLEAN最近一次 FETCH 成功傳回列 → TRUE
%NOTFOUNDBOOLEAN與 %FOUND 相反
%ISOPENBOOLEAN游標處於開啟狀態 → TRUE
%ROWCOUNTNUMBER已擷取列數

5. 關閉

CLOSE c1;

關閉後再操作會拋出 INVALID_CURSOR 例外。區塊結束時 Oracle 會隱式關閉。

完整程式碼範例

DECLARE
  CURSOR c1 IS SELECT view_name FROM all_views WHERE rownum <= 10 ORDER BY view_name;
  v_name VARCHAR2(40);
BEGIN
  OPEN c1;
  FETCH c1 INTO v_name;
  WHILE c1%FOUND LOOP
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(c1%ROWCOUNT) || ' ' || v_name);
    FETCH c1 INTO v_name;
  END LOOP;
  CLOSE c1;
END;
/

效能優勢

顯式游標避免重複剖析 (Parsing),針對重複執行的靜態查詢可顯著降低 CPU 開銷;配合 BULK COLLECT/FORALL (8i 以上) 更能批次處理大量資料。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved