PL/SQL有四種類型的循環:簡單循環、WHILE循環、FOR循環以及遊标FOR循環。在這裡我們主要讨論前三種,除此之外,還将讨論Oracle 11g中新引入的CONTINUE語句。
一、 簡單循環
LOOP
STATEMENT 1;
STATEMENT 2;
...
STATEMENT N;
END LOOP;
上述語句會無限制執行,因為沒有語句指定何時可以終止循環。是以,簡單循環稱為無限循環。
一般循環會有退出條件。退出條件有兩種形式:EXIT 和 EXIT WHEN。l兩者是等價的。文法分别如下:
LOOP LOOP
STATEMENT 1; STATEMENT 1;
STATEMENT 2; STATEMENT 2;
IF CONDITION THEN EXIT WHEN CONDITION;
EXIT; END LOOP;
END IF;
END LOOP;
如下所示:
DECLARE
v_counter BINARY_INTEGER := 0;
BEGIN
LOOP
v_counter := v_counter+1;
DBMS_OUTPUT.PUT_LINE('v_counter = '||v_counter);
IF v_counter = 5 THEN -->> EXIT語句
EXIT;
END IF;
END LOOP;
END;
DECLARE
v_counter BINARY_INTEGER := 0;
BEGIN
LOOP
v_counter := v_counter+1;
DBMS_OUTPUT.PUT_LINE('v_counter = '||v_counter);
EXIT WHEN v_counter = 5; -->> EXIT WHEN語句
END LOOP;
END;
二、 WHILE循環
WHILE循環的結構如下所示:
WHILE CONDITION LOOP
STATEMENT 1;
STATEMNET 2;
...
STATEMENT N;
上例簡單循環的例子可改寫如下:
DECLARE
v_counter BINARY_INTEGER := 0;
BEGIN
WHILE v_counter < 5 LOOP
v_counter := v_counter+1;
DBMS_OUTPUT.PUT_LINE('v_counter = '||v_counter);
END LOOP;
END;
在WHILE循環體中,同樣可以使用EXIT和EXIT WHEN語句以提前終止循環
三、 整型值FOR循環
其結構如下:
FOR loop_counter IN [REVERSE] lower_limit..upper_limit LOOP
END LOOP;
變量loop_counter是隐含定義的索引變量。不需要在PL/SQL語句塊的聲明部分定義循環計數器。這個變量時循環結構定義的。lower_limit和upper_limit是兩個整數數字或者在運作時計算結果為整數值的表達式,雙點号(..)是範圍操作符。如果使用IN REVERSE,則循環計數器會從upper_limit到lower_limit。
上例簡單循環的例子可改寫如下:
BEGIN
FOR v_counter IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE('v_counter = '||v_counter);
END LOOP;
END;
上述讨論的EXIT和EXIT WHEN語句也可以在FOR循環的循環體中使用。
四、 CONTINUE語句
CONTINUE語句有兩種形式:CONTINUE和CONTINUE WHEN
CONTINUE文法如下:
IF CONTINUE_CONDITION THEN
CONTINUE;
END IF;
CONTINUE WHEN文法如下:
CONTINUE WHEN CONTINUE_CONDITION;
二者等效。
舉例如下,求1到10内偶數的乘積。
DECLARE
v_sum number := 1;
BEGIN
FOR i IN 1..10 LOOP
IF MOD(i,2) != 0 THEN
CONTINUE;
END IF;
v_sum := v_sum*i;
END LOOP;
DBMS_OUTPUT.PUT_LINE('The number is = '||v_sum);
END;
五、嵌套循環
我們已經讨論過三種類型的循環:簡單循環、WHILE循環以及FOR循環。任何一種循環都可以嵌套在其他循環中。
試舉一例:
DECLARE
v_counter1 INTEGER :=0;
v_counter2 INTEGER;
BEGIN
WHILE v_counter1 < 3 LOOP
DBMS_OUTPUT.PUT_LINE('v_counter1: '||v_counter1);
v_counter2 := 0;
LOOP
DBMS_OUTPUT.PUT_LINE('v_counter2: '||v_counter2);
v_counter2 := v_counter2+1;
EXIT WHEN v_counter2 >= 2;
END LOOP;
v_counter1 := v_counter1+1;
END LOOP;
END;
六、循環标簽
循環标簽出現在循環的開始處,在循環語句的結尾處使用。在嵌套循環中,循環标簽很有必要,因為這會大大提升代碼的可讀性。
在某些場合,必須使用循環标簽,如下例所示:
BEGIN
<<outer>>
FOR v_counter IN 1..3 LOOP
<<inner>>
FOR v_counter IN 1..2 LOOP
DBMS_OUTPUT.PUT_LINE('outer.v_counter '||outer.v_counter);
DBMS_OUTPUT.PUT_LINE('inner.v_counter '||inner.v_counter);
END LOOP inner;
END LOOP outer;
END;
在這裡我們用了循環标簽,因為内、外部循環都使用了相同的循環計數器v_counter。為了引用v_counter的内部直和外部值,就要使用循環标簽。當然,循環标簽的名稱可任意取。