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

Oracle PL/SQL程式流程控制完整指南:條件判斷與迴圈結構

     編輯:Oracle 資料庫基礎

PL/SQL流程控制核心結構

PL/SQL提供完整的結構化程式設計能力,核心包含條件控制(IF/CASE)與迴圈控制(LOOP/FOR/WHILE)兩大類。

一、條件控制結構

1. IF-THEN 基礎結構

IF condition THEN
  statements;
END IF;

語意: 條件為TRUE執行THEN~END IF區塊,FALSE/NULL則跳過。

2. IF-THEN-ELSE 雙分支

IF condition THEN
  statements_1;
ELSE
  statements_2;
END IF;

TRUE執行THEN~ELSE,FALSE/NULL執行ELSE~END IF。

3. IF-THEN-ELSIF 多分支(等同ELSE IF)

IF condition1 THEN
  stmt1;
ELSIF condition2 THEN
  stmt2;
ELSIF condition3 THEN
  stmt3;
ELSE
  stmt4;
END IF;
stmt5;  -- 後續共同執行

依序評估條件,首個TRUE對應區塊執行後跳至END IF,全 FALSE執行ELSE區塊。

4. 巢狀IF結構

IF (a > b) AND (a > c) THEN
  g := a;
ELSE
  g := b;
  IF c > g THEN
    g := c;
  END IF;
END IF;

尋找三數最大值經典邏輯。實務建議:層級超過3層考慮重構為CASE或獨立函數。

5. CASE表達式/陳述式(9i+推薦)

-- 簡單CASE
CASE expr
  WHEN val1 THEN result1
  WHEN val2 THEN result2
  ELSE result3
END;

-- 搜尋CASE(條件任意複雜)
CASE
  WHEN cond1 THEN result1
  WHEN cond2 THEN result2
  ELSE result3
END;

優點:可嵌入SQL語句、可作為運算式一部分、可讀性優於多層ELSIF。

二、迴圈控制結構

1. 基本LOOP - 無條件迴圈

LOOP
  statements;
  EXIT [WHEN condition];  -- 必須有退出機制
END LOOP;

2. WHILE LOOP - 前測試迴圈

WHILE condition LOOP
  statements;
END LOOP;

條件為TRUE進入,進入前先判斷,可能零次執行。

3. FOR LOOP - 計數器迴圈

-- 正向
FOR i IN 1..10 LOOP
  DBMS_OUTPUT.PUT_LINE(i);
END LOOP;

-- 反向
FOR i IN REVERSE 1..10 LOOP
  ...
END LOOP;

計數器隱式宣告、不可修改、範圍確定時首選。

4. 游標FOR LOOP - 隱式游標管理

FOR rec IN (SELECT * FROM emp WHERE deptno = 10) LOOP
  DBMS_OUTPUT.PUT_LINE(rec.ename);
END LOOP;

自動OPEN/FETCH/CLOSE,最簡潔的游標遍歷方式。

三、流程控制輔助語句

語句作用適用範圍
EXIT立即退出當前迴圈LOOP/WHILE/FOR
EXIT WHEN條件成立時退出LOOP/WHILE/FOR
CONTINUE跳過本次迭代進入下一次 (11g+)LOOP/WHILE/FOR
GOTO無條件跳轉標籤 (慎用)區塊內
NULL空操作,佔位用任何可執行語句處

四、實戰範例:薪資等級判斷與統計

DECLARE
  v_emp_rec emp%ROWTYPE;
  v_grade   VARCHAR2(1);
  v_cnt     NUMBER := 0;
  v_total   NUMBER := 0;
BEGIN
  FOR v_emp_rec IN (SELECT * FROM emp) LOOP
    v_total := v_total + v_emp_rec.sal;
    v_cnt := v_cnt + 1;
    
    -- CASE表達式判斷等級
    v_grade := CASE
      WHEN v_emp_rec.sal >= 5000 THEN 'A'
      WHEN v_emp_rec.sal >= 3000 THEN 'B'
      WHEN v_emp_rec.sal >= 1500 THEN 'C'
      ELSE 'D'
    END;
    
    DBMS_OUTPUT.PUT_LINE(v_emp_rec.ename || ': ' || v_emp_rec.sal || ' -> Grade ' || v_grade);
  END LOOP;
  
  DBMS_OUTPUT.PUT_LINE('Avg Salary: ' || ROUND(v_total/v_cnt, 2));
EXCEPTION
  WHEN ZERO_DIVIDE THEN
    DBMS_OUTPUT.PUT_LINE('No employees found');
END;

五、最佳實踐與避坑指南

✅ 推薦做法:
  • 條件分支優先使用CASE表達式/陳述式
  • 已知範圍迴圈使用FOR LOOP
  • 游標遍歷使用游標FOR LOOP
  • 複雜退出條件使用EXIT WHEN
  • 變數宣告區盡量靠近使用位置
❌ 避免做法:
  • 超過3層IF-THEN-ELSIF巢狀
  • GOTO語句(除極少數狀態機場景)
  • 迴圈中修改FOR LOOP計數器
  • WHILE TRUE無限迴圈缺乏EXIT機制
  • 條件判斷中直接賦值而非比較(:= vs =)

六、效能考量

  • PL/SQL引擎與SQL引擎切換成本高,迴圈中避免單行SQL,改用BULK COLLECT/FORALL
  • 大量資料處理考慮並行化(DBMS_PARALLEL_EXECUTE)
  • 條件判斷順序:高概率、低成本條件優先(短路求值)

總結

PL/SQL流程控制提供工業級程式設計能力。核心原則:用CASE替代多層IF、用FOR LOOP替代手工計數、用游標FOR LOOP簡化游標操作、嚴格控制迴圈退出條件、善用CONTINUE簡化邏輯。配合現代特性(11g+ CONTINUE、CASE增強),可編寫清晰、高效、可維護的業務邏輯。

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