顯式游標操作遵循標準化流程:OPEN → FETCH(迴圈) → CLOSE。本文詳細解析每個階段的語法、範例與最佳實踐。
OPEN cursor_name;
執行關聯查詢、分配上下文記憶體、指標定位於第一行之前。若查詢含綁定變數,以OPEN當下值為準。
FETCH cursor_name INTO variable[, variable,...];
關鍵要求:目標變數與SELECT列表一一對應(數量、型別、順序)。
SET SERVEROUTPUT ON
DECLARE
v_ename EMP.ENAME%TYPE;
v_salary EMP.SALARY%TYPE;
CURSOR c_emp IS SELECT ename, salary FROM emp;
BEGIN
OPEN c_emp;
FETCH c_emp INTO v_ename, v_salary;
DBMS_OUTPUT.PUT_LINE('Salary of Employee ' || v_ename || ' is ' || v_salary);
CLOSE c_emp;
END;
手工重複FETCH不可維護,標準模式:
SET SERVEROUTPUT ON
DECLARE
v_ename EMP.ENAME%TYPE;
v_salary EMP.SALARY%TYPE;
CURSOR c_emp IS SELECT ename, salary FROM emp;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_ename, v_salary;
EXIT WHEN c_emp%NOTFOUND; -- 核心終止條件
DBMS_OUTPUT.PUT_LINE('Salary of Employee ' || v_ename || ' is ' || v_salary);
END LOOP;
CLOSE c_emp;
END;
| 屬性 | 型別 | 含義 | 典型用途 |
|---|---|---|---|
| %FOUND | BOOLEAN | 最近FETCH成功返回行 | 條件判斷、日誌記錄 |
| %NOTFOUND | BOOLEAN | 最近FETCH未返回行(含超出範圍) | 迴圈終止條件首選 |
| %ROWCOUNT | NUMBER | 累計成功FETCH行數 | 進度監控、分批提交控制 |
| %ISOPEN | BOOLEAN | 游標是否開啟狀態 | 防重複開啟、異常處理檢查 |
CLOSE cursor_name;
強制規範:
IF cursor_name%ISOPEN THEN CLOSE cursor_name; END IF;DECLARE
v_ename EMP.ENAME%TYPE;
v_salary EMP.SALARY%TYPE;
CURSOR c_emp IS SELECT ename, salary FROM emp;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_ename, v_salary;
EXIT WHEN c_emp%NOTFOUND;
-- 業務邏輯處理
DBMS_OUTPUT.PUT_LINE('Processing: ' || v_ename);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
IF c_emp%ISOPEN THEN
CLOSE c_emp;
END IF;
RAISE; -- 重新拋出異常或記錄日誌
END;
規範化的游標操作流程是PL/SQL程式穩定性的基石。建立統一的程式碼範本,強制要求異常處理中的資源清理,配合游標屬性進行精準流程控制,可消除90%以上的游標相關問題。