PL/SQL 程式設計中,條件控制是核心邏輯構建塊。Oracle PL/SQL 提供三層級的 IF 結構,涵蓋從單一分支到多重分支的所有場景。
| 結構 | 適用場景 | 關鍵字 |
|---|---|---|
| IF-THEN | 單一條件,滿足才執行,否則跳過 | IF / THEN / END IF |
| IF-THEN-ELSE | 二元選擇,滿足執行 A,否則執行 B | IF / THEN / ELSE / END IF |
| IF-THEN-ELSIF | 多條件互斥,依序判斷,匹配即停止 | IF / THEN / ELSIF / ELSE / END IF |
IF v_salary > 50000 THEN v_bonus := v_salary * 0.1; END IF;
• 條件為 TRUE 才進入 THEN 區塊。
• 無 ELSE,條件為 FALSE 或 NULL 直接跳過。
• 每個 IF 必須以 END IF 結束,別漏寫分號。
IF v_dept_id = 10 THEN v_dept_name := 'ACCOUNTING'; ELSE v_dept_name := 'OTHER'; END IF;
• 確保一定有一條路徑被執行。
• 適合「布林決策」:是/否、存在/不存在、通過/拒絕。
IF v_grade = 'A' THEN v_bonus_pct := 0.20; ELSIF v_grade = 'B' THEN v_bonus_pct := 0.15; ELSIF v_grade = 'C' THEN v_bonus_pct := 0.10; ELSE v_bonus_pct := 0; END IF;
• 自上而下順序評估,首個 TRUE 執行對應區塊後直接跳出,不再檢查後續 ELSIF。
• 最後的 ELSE 為「養老條款」,捕獲所有未匹配情況(含 NULL)。
• 切記關鍵字是 ELSIF(無 E),而非 ELSEIF。
IF 建議重構為 CASE 表達式或拆分子程序。NULL = NULL 為 NULL (非 TRUE),建議顯式 IF v_var IS NULL THEN ... 或用 NVL/COALESCE 預處理。v_result := CASE WHEN cond1 THEN val1 WHEN cond2 THEN val2 ELSE val3 END; 更簡潔且可嵌入 SQL。| 錯誤代碼 | 原因 | 修正 |
|---|---|---|
| PLS-00103 | 漏寫 THEN 或 END IF | 補全關鍵字,每行結構對齊檢查 |
| PLS-00382 | 在 IF 中引用未聲明變數 | 先在 DECLARE 區聲明 |
| 邏輯不符 | 用 ELSEIF 而非 ELSIF | 改為 ELSIF |
掌握這三種 IF 結構,配合 CASE、LOOP、EXCEPTION,即可構建健壯的 PL/SQL 業務邏輯。