迴圈是程式控制流程的核心結構。Oracle PL/SQL 提供三種基本迴圈語法:基本 LOOP、WHILE LOOP、FOR LOOP。本文逐一說明語法、範例與適用情境,協助開發人員選擇最適合的寫法。
LOOP
statements;
EXIT [WHEN condition]; -- 必須有離開條件,否則無限迴圈
END LOOP;
DECLARE
counter NUMBER := 0;
BEGIN
LOOP
counter := counter + 1;
EXIT WHEN counter = 5; -- 當 counter 等於 5 時跳出
DBMS_OUTPUT.PUT_LINE('Counter = ' || counter);
END LOOP;
END;
/
EXIT 可出現在任意位置;EXIT WHEN 為條件式跳出。WHILE condition LOOP
statements;
END LOOP;
DECLARE
counter NUMBER := 0;
BEGIN
WHILE counter < 6 LOOP
counter := counter + 1;
DBMS_OUTPUT.PUT_LINE('Counter = ' || counter);
END LOOP;
END;
/
FOR loop_counter IN [REVERSE] lower_bound .. upper_bound LOOP
statements;
END LOOP;
loop_counter 為隱性宣告的區域整數變數,不可在迴圈內指派值。REVERSE 關鍵字可反向遞減 (upper_bound 到 lower_bound)。BEGIN
FOR cnt IN 1 .. 5 LOOP
DBMS_OUTPUT.PUT_LINE('Count = ' || cnt);
END LOOP;
END;
/
BEGIN
FOR cnt IN REVERSE 1 .. 5 LOOP
DBMS_OUTPUT.PUT_LINE('Reverse Count = ' || cnt);
END LOOP;
END;
/
| 主題 | 說明 |
|---|---|
| 巢狀迴圈標籤 | 使用 <<label>> 標籤搭配 EXIT label WHEN ... 跳出外層迴圈。 |
| CONTINUE 陳述式 (11g+) | CONTINUE WHEN condition; 可跳過本次迭代剩餘敘述,直接進入下一次迴圈。 |
| FOR 迴圈變數不可指派 | 編譯錯誤:PLS-00363: expression 'CNT' cannot be used as an assignment target。 |
| 隱性游標 FOR 迴圈 | FOR rec IN (SELECT * FROM emp) LOOP ... END LOOP; 自動 OPEN/FETCH/CLOSE,最推薦寫法。 |
BULK COLLECT ... LIMIT + FORALL,減少 Context Switch。FOR;條件複雜或需提前跳出用 WHILE 或 LOOP。掌握三種迴圈語法與進階控制陳述式,能撰寫出結構清晰、效能優異的 PL/SQL 程式。實務上建議:已知範圍用 FOR、未知範圍用 WHILE、至少執行一次用 LOOP,並善用標籤與 CONTINUE 控制複雜流程。