全部產品
Search
文件中心

PolarDB:迴圈

更新時間:Jul 06, 2024

通過 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 語句來確定何時退出迴圈。

說明 用於確定何時退出迴圈的條件運算式必須進行修改。EXIT 語句在其條件運算式為 true 時終止迴圈。WHILE 語句在其條件運算式為 false 時終止(或從不開始迴圈)。
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;

由於從未執行迴圈體,因此此樣本沒有輸出。

說明 SPL 還支援 CURSOR FOR 迴圈。