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;
END LOOP;
上例简单循环的例子可改写如下:
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
STATEMENT 1;
STATEMENT 2;
...
STATEMENT N;
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 <> 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的内部直和外部值,就要使用循环标签。当然,循环标签的名称可任意取。