1、loop ... end loop loop 循环是最基本的循环,也称为无条件循环。在这种类型的循环中如果没有指定exit字句,将出现死循环。所以在loop循环中必须指定exit语句。loop 循环的语法格式如下:

loop
  statements;
  exit when condition;
end loop;

所有包含在循环中的语句均会重复执行,在循环的重复或迭代过程中,都要检查退出条件表达式是否为真。如果表达式为真,则会跳过exit后的所有语句,病跳刀end loop后的第一个语句。如果开始就满足了when给出的条件,loop和exit之间的语句只会被执行一次,但如果没有when条件语句,则会出现死循环。loop循环相当于Java 中的do ... while 循环。

SQL> set serveroutput on
SQL> declare
  2    i number := 1;
  3  begin
  4    loop
  5      dbms_output.put_line(i || '的平方为' || power(i, 2));
  6      i := i + 1;
  7      exit when i > 10;
  8    end loop;
  9  end;
 10  /
1的平方为1
2的平方为4
3的平方为9
4的平方为16
5的平方为25
6的平方为36
7的平方为49
8的平方为64
9的平方为81
10的平方为100

PL/SQL 过程已成功完成。

2、while循环

while循环用于事先不知道控制循环终止的变量值的情况。与loop循环的不同之处在于while循环在循环的顶部包括了判断条件。与Java中的while循环相似。

while condition
loop
  statements;
end loop;

下边的程序块将使用while循环打印50以内能被3整除的整数。

SQL> set serveroutput on
SQL> declare
  2    i number := 1;
  3  begin
  4    while i < 50 loop
  5    if mod(i, 3) = 0 then
  6      dbms_output.put_line(i || ' ');
  7    end if;
  8      i := i + 1;
  9    end loop;
 10  end;
 11  /
3
6
9
12
15
18
21
24
27
30
33
36
39
42
45
48

PL/SQL 过程已成功完成。

3、for循环

for循环使用一个循环计数器,并通过它来控制循环执行次数。计数器可以从小到大记录,也可以从大到小进行记录。如果不满足循环条件,则跳出循环。for 循环的语法结构如下:

for loop_variable_name in [reverse] lower_bound...upper_bound
loop
  statements;
end loop

loop_variable_name参数指定循环计数器,循环计数器按照步长1递增,当使用关键字reverse上,表示递减。lower_bound 和upper_bound则指定了循环计数器的下限和上限。例如:下面的程序通过for循环计算1到100之间的整数之和。

SQL> set serveroutput on
SQL> declare
  2    sum_num number := 0;
  3  begin
  4    for i in 1..100 loop
  5    sum_num := sum_num + i;
  6    end loop;
  7    dbms_output.put_line(sum_num);
  8  end;
  9  /
5050

PL/SQL 过程已成功完成。

上边的例子中,循环计数器i不需要在declare部分定义,它属于for循环的一部分。计数器只能在循环体内使用,不能在循环的外部使用循环计数器。当使用reverse时,循环计数器将自动减1,并强制计数器的取值从上限到下限值。

SQL> set serveroutput on
SQL> declare
  2    sum_num number := 0;
  3  begin
  4    for i in reverse 1..100 loop
  5      sum_num := sum_num + i;
  6    end loop;
  7
  8    dbms_output.put_line(sum_num);
  9  end;
 10  /
5050

PL/SQL 过程已成功完成。