游標是從數據表提取的結果集在內存中的臨時存儲,帶有一個指針指向當前行,通過 FETCH 移動指針實現逐行處理,最終將結果寫回數據庫。
CURSOR 游標名 IS SELECT 語句;
示例:定義變量 tempsal 類型同 scott.emp.sal,游標 mycursor 查詢薪資大於該變量的記錄。
SET SERVEROUTPUT ON DECLARE tempsal scott.emp.sal%TYPE; CURSOR mycursor IS SELECT * FROM scott.emp WHERE sal > tempsal; BEGIN tempsal := 800; OPEN mycursor; END;
執行結果見圖,腳本:第9章\cursordefine.sql。

OPEN 游標名; 兩步驟:① 將符合條件記錄載入內存 ② 指針指向首行。
語法:FETCH 游標名 INTO 變量列表 | 記錄型變量;
示例:定義 cursorrecord mycursor%ROWTYPE,提取首行並輸出 deptno。
DECLARE tempsal scott.emp.sal%TYPE; CURSOR mycursor IS SELECT * FROM scott.emp WHERE sal > tempsal; cursorrecord mycursor%ROWTYPE; BEGIN tempsal := 800; OPEN mycursor; FETCH mycursor INTO cursorrecord; DBMS_OUTPUT.PUT_LINE(TO_CHAR(cursorrecord.deptno)); END;
腳本:cursorfetch.sql,執行截圖如圖。

CLOSE 游標名; 釋放內存資源,防止游標洩漏。
| 屬性 | 用途 |
|---|---|
%ISOPEN | 判斷游標是否已打開,未打開時 FETCH 會報錯 |
%FOUND | 最近一次 FETCH 是否返回行 |
%NOTFOUND | 與 %FOUND 互斥 |
%ROWCOUNT | 已提取的行數 |
IF mycursor%ISOPEN THEN
FETCH mycursor INTO cursorrecord;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(cursorrecord.deptno));
ELSE
DBMS_OUTPUT.PUT_LINE('游標沒有打開!');
END IF;
執行截圖見圖,腳本隱含於示例中。

掌握游標生命周期(定義→打開→循環提取→關閉)與屬性檢查,是編寫高效 PL/SQL 過程式的關鍵。