通過 LOOP、EXIT、CONTINUE、WHILE 和 FOR 語句,您可以安排 SPL 程式重複一系列命令。
LOOP
LOOP
statements
END LOOP;
LOOP 定義一個無條件迴圈,該迴圈將無限期地重複執行,直到被 EXIT 或 RETURN 語句終止。
EXIT
EXIT [ WHEN expression ];
終止最裡面的迴圈,並接著執行 END LOOP 後面的語句。
如果 WHEN 存在,則僅當指定條件為 true 時才執行迴圈退出;否則控制權會傳遞給 EXIT 後面的語句。
EXIT 可用於提前退出所有類型的迴圈;它不限於與無條件迴圈一起使用。
下面是一個簡單的迴圈樣本,該迴圈執行十次迭代,然後使用 EXIT 語句終止。
DECLARE
v_counter NUMBER(2);
BEGIN
v_counter := 1;
LOOP
EXIT WHEN v_counter > 10;
DBMS_OUTPUT.PUT_LINE('Iteration # ' || v_counter);
v_counter := v_counter + 1;
END LOOP;
END;
下面是此程式的輸出。
Iteration # 1
Iteration # 2
Iteration # 3
Iteration # 4
Iteration # 5
Iteration # 6
Iteration # 7
Iteration # 8
Iteration # 9
Iteration # 10
CONTINUE
CONTINUE 語句提供一種在跳過中間語句時繼續迴圈的下一迭代的方式。
當遇到 CONTINUE 語句時,將開始最裡面迴圈的下一迭代,這會跳過 CONTINUE 語句後面的所有語句,直到迴圈結束。也就是說,控制權將傳回迴圈控製表達式(如果有),並將對迴圈體重新進行求值。
如果使用 WHEN 子句,則僅當 WHEN 子句中指定運算式的求值結果為 true 時才開始迴圈的下一迭代。否則,控制權將傳給 CONTINUE 語句後面的下一個語句。
CONTINUE 語句不能在迴圈外部使用。
下面是上一樣本的變體,它使用 CONTINUE 語句跳過奇數的顯示。
DECLARE
v_counter NUMBER(2);
BEGIN
v_counter := 0;
LOOP
v_counter := v_counter + 1;
EXIT WHEN v_counter > 10;
CONTINUE WHEN MOD(v_counter,2) = 1;
DBMS_OUTPUT.PUT_LINE('Iteration # ' || v_counter);
END LOOP;
END;
下面是上述程式的輸出。
Iteration # 2
Iteration # 4
Iteration # 6
Iteration # 8
Iteration # 10
WHILE
WHILE expression LOOP
statements
END LOOP;
WHILE 語句重複一系列語句,只要條件運算式的求值結果為 TRUE。就在每次進入迴圈體之前檢查條件。
以下樣本包含與上一樣本相同的邏輯,但 WHILE 語句用於取代 EXIT 語句來確定何時退出迴圈。
DECLARE
v_counter NUMBER(2);
BEGIN
v_counter := 1;
WHILE v_counter <= 10 LOOP
DBMS_OUTPUT.PUT_LINE('Iteration # ' || v_counter);
v_counter := v_counter + 1;
END LOOP;
END;
以下樣本產生的結果與前一樣本相同。
Iteration # 1
Iteration # 2
Iteration # 3
Iteration # 4
Iteration # 5
Iteration # 6
Iteration # 7
Iteration # 8
Iteration # 9
Iteration # 10
FOR(整型變數)
FOR name IN [REVERSE] expression .. expression LOOP
statements
END LOOP;
此形式的 FOR 建立一個對一系列整數值執行迭代的迴圈。變數 name 自動定義為 INTEGER 類型並僅在迴圈記憶體在。給出迴圈範圍的兩個運算式在進入迴圈時進行一次求值。迭代步長為 +1,name 的值從 .. 左側的 expression 開始,在 name 超過 .. 右側的 expression 值後終止。因而,這兩個運算式擔任以下角色:start-value .. end-value。
可選的 REVERSE 子句指定迴圈應按反向順序迭代。首次通過迴圈時,name 設定為最右側 expression 運算式的值;當 name 小於最左側 expression 時迴圈終止時。
以下樣本通過使用從 1 到 10 執行迭代的 FOR 迴圈,更進一步簡化了 WHILE 迴圈樣本。
BEGIN
FOR i IN 1 .. 10 LOOP
DBMS_OUTPUT.PUT_LINE('Iteration # ' || i);
END LOOP;
END;
下面是使用 FOR 語句的輸出。
Iteration # 1
Iteration # 2
Iteration # 3
Iteration # 4
Iteration # 5
Iteration # 6
Iteration # 7
Iteration # 8
Iteration # 9
Iteration # 10
如果開始值大於結束值,則根本不會執行迴圈體。如以下樣本所示,不會引發錯誤。
BEGIN
FOR i IN 10 .. 1 LOOP
DBMS_OUTPUT.PUT_LINE('Iteration # ' || i);
END LOOP;
END;
由於從未執行迴圈體,因此此樣本沒有輸出。