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

Oracle游標操作實戰:開啟、提取、迴圈與關閉完整指南

     編輯:Oracle 資料庫基礎

游標操作核心三步驟

顯式游標操作遵循標準化流程:OPEN → FETCH(迴圈) → CLOSE。本文詳細解析每個階段的語法、範例與最佳實踐。

一、OPEN:啟動結果集

OPEN cursor_name;

執行關聯查詢、分配上下文記憶體、指標定位於第一行之前。若查詢含綁定變數,以OPEN當下值為準。

二、FETCH:逐行提取資料

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;

四、游標屬性:流程控制儀表板

屬性型別含義典型用途
%FOUNDBOOLEAN最近FETCH成功返回行條件判斷、日誌記錄
%NOTFOUNDBOOLEAN最近FETCH未返回行(含超出範圍)迴圈終止條件首選
%ROWCOUNTNUMBER累計成功FETCH行數進度監控、分批提交控制
%ISOPENBOOLEAN游標是否開啟狀態防重複開啟、異常處理檢查

五、CLOSE:資源釋放

CLOSE cursor_name;

強制規範:

  1. 正常流程結束時關閉
  2. 異常處理區塊必須包含關閉邏輯
  3. 關閉前可檢查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;

七、常見錯誤與避坑指南

  • ❌ 忘記CLOSE導致游標洩漏,累積佔用PGA記憶體
  • ❌ FETCH變數順序/型別與SELECT不匹配,引發VALUE_ERROR
  • ❌ 未檢查%NOTFOUND直接使用變數值,處理到無效資料
  • ❌ 在FOR迴圈外部引用游標屬性(隱式游標無%ROWCOUNT等屬性)

總結

規範化的游標操作流程是PL/SQL程式穩定性的基石。建立統一的程式碼範本,強制要求異常處理中的資源清理,配合游標屬性進行精準流程控制,可消除90%以上的游標相關問題。

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