PL/SQL循环
可能有一种情况,当需要执行的代码块的几个多次。在一般情况下,语句顺序执行:一个函数的第一条语句,首先执行,然后是第二个...等等。
编程语言提供了各种控制结构,允许更多复杂的执行路径。
循环语句可以让我们执行语句多次或一个组,下面是在大多数编程语言循环语句的一般形式:
![Loop Architecture](https://i-blog.csdnimg.cn/blog_migrate/90a3c904592571e7b08349adc3b8fa9e.jpeg)
PL/ SQL提供了循环以下类型的处理循环的要求。点击以下链接查看详细信息。
循环类型 | 描述 |
---|---|
PL/SQL基础循环 | 在这个循环结构,语句序列封闭在LOOP和END LOOP语句之间。在每次迭代中,语句序列被执行,然后在循环的顶部恢复控制 |
PL/SQL WHILE循环 | 重复声明语句或一组,而给定的条件为真,它测试条件执行循环体前 |
PL/SQL FOR循环 | 执行语句序列多次和简写管理该循环变量的代码 |
PL/SQL内嵌循环 | 可以使用一个或多个循环中的任何其它基本回路,同时或循环 |
标记一个PL/SQL循环
PL/ SQL循环可以被标记。标记应该用双尖括号括起来(<<和>>),并出现在LOOP语句的开头。标签名称也可以出现在循环语句结束。可以使用标签在EXIT语句从循环退出。
下面的程序说明了这个概念:
DECLARE i number(1); j number(1); BEGIN << outer_loop >> FOR i IN 1..3 LOOP << inner_loop >> FOR j IN 1..3 LOOP dbms_output.put_line('i is: '|| i || ' and j is: ' || j); END loop inner_loop; END loop outer_loop; END; /
当上述代码在SQL提示符执行时,它产生了以下结果:
i is: 1 and j is: 1 i is: 1 and j is: 2 i is: 1 and j is: 3 i is: 2 and j is: 1 i is: 2 and j is: 2 i is: 2 and j is: 3 i is: 3 and j is: 1 i is: 3 and j is: 2 i is: 3 and j is: 3 PL/SQL procedure successfully completed.
循环控制语句
循环控制语句改变其正常的顺序执行。当执行离开范围,在该范围内创建的所有对象自动被销毁。
PL/ SQL支持以下控制语句。标记循环也采取了循环外的控制。点击以下链接查看他们的详细资料。
控制语句 | 描述 |
---|---|
EXIT语句 | 在EXIT语句END LOOP后立即完成返回,控制进到该语句 |
CONTINUE语句 | 将导致循环跳过其主体的其余部分,并立即重新测试其使用情况声明之前 |
GOTO语句 | 控制权转移给标签的语句。虽然不建议在程序中使用GOTO语句 |
PL/SQL基本循环语句
基本的循环结构封装在LOOP和END LOOP语句之间语句序列。随着每次迭代,语句顺序被执行,然后在循环的顶部控制过程。
语法:
PL/SQL编程语言的一个基本循环的语法是:
LOOP
Sequence of statements;
END LOOP;
在这里,声明(S)的序列可以是单个语句或语句块。 EXIT指令或EXIT WHEN语句需要退出循环。
示例:
DECLARE
x number := 10;
BEGIN
LOOP
dbms_output.put_line(x);
x := x + 10;
IF x > 50 THEN
exit;
END IF;
END LOOP;
-- after exit, control resumes here
dbms_output.put_line('After Exit x is: ' || x);
END;
/
当上述代码在SQL提示符执行时,它产生了以下结果:
10 20 30 40 50 After Exit x is: 60 PL/SQL procedure successfully completed.
可以使用EXIT WHEN语句,而不是EXIT语句:
DECLARE
x number := 10;
BEGIN
LOOP
dbms_output.put_line(x);
x := x + 10;
exit WHEN x > 50;
END LOOP;
-- after exit, control resumes here
dbms_output.put_line('After Exit x is: ' || x);
END;
/
当上述代码在SQL提示符执行时,它产生了以下结果:
10 20 30 40 50 After Exit x is: 60 PL/SQL procedure successfully completed.
PL/SQL WHILE循环语句
WHILE循环语句在PL/SQL编程语言,只要给定的条件为真,则执行目标语句多次。
语法:
WHILE condition LOOP
sequence_of_statements
END LOOP;
示例:
DECLARE
a number(2) := 10; BEGIN WHILE a < 20 LOOP dbms_output.put_line('value of a: ' || a); a := a + 1; END LOOP; END; /
当上述代码在SQL提示符执行时,它产生了以下结果:
value of a: 10 value of a: 11 value of a: 12 value of a: 13 value of a: 14 value of a: 15 value of a: 16 value of a: 17 value of a: 18 value of a: 19 PL/SQL procedure successfully completed.
PL/SQL FOR循环语句
FOR循环重复的控制结构,可以有效地编写需要执行的特定次数的循环。
语法:
FOR counter IN initial_value .. final_value LOOP sequence_of_statements; END LOOP;
下面是控制在一个流程的循环:
-
初始步骤首先被执行,并且只有一次。这一步可以声明和初始化任何循环控制变量。
-
接着,condition,initial_value.. final_value 进行计算。如果为true,则执行循环体。如果为false,在循环体不执行,只是之后的for循环流量控制跳转到下一条语句。
-
循环体的执行后,计数器变量的值被增加或减少。
-
条件现在重新计算。如果为true,循环执行的过程重复(循环体,然后增加步,然后再次条件)。之后条件为false,则FOR-LOOP终止。
以下是PL/SQL for循环的一些特点:
-
initial_value 和 循环变量 或计算器 final_value 可以是字面值,变量或表达式,但必须计算结果为数字。否则,PL/SQL就会抛出预定义异常VALUE_ERROR。
-
initial_value不必为1; 但是循环计数器增量(或减量)必须为1。
-
PL/SQL允许动态确定在运行时的循环范围。
示例:
DECLARE
a number(2); BEGIN FOR a in 10 .. 20 LOOP dbms_output.put_line('value of a: ' || a); END LOOP; END; /
当上述代码在SQL提示符执行时,它产生了以下结果:
value of a: 10 value of a: 11 value of a: 12 value of a: 13 value of a: 14 value of a: 15 value of a: 16 value of a: 17 value of a: 18 value of a: 19 value of a: 20 PL/SQL procedure successfully completed.
反转FOR循环语句
缺省情况下,迭代前进从初始值到最终值,大体是由上界到下界约束。可以通过使用REVERSE关键字顺序相反。在这种情况下,迭代前进的其他方式。每次迭代后循环计数器递减。
但是,必须写的范围边界在升序(非下降)的顺序。下面的程序说明了这一点:
DECLARE
a number(2) ; BEGIN FOR a IN REVERSE 10 .. 20 LOOP dbms_output.put_line('value of a: ' || a); END LOOP; END; /
当上述代码在SQL提示符执行时,它产生了以下结果:
value of a: 20 value of a: 19 value of a: 18 value of a: 17 value of a: 16 value of a: 15 value of a: 14 value of a: 13 value of a: 12 value of a: 11 value of a: 10 PL/SQL procedure successfully completed.
PL/SQL嵌套循环
PL/SQL允许使用一个循环内嵌套另一个循环。下面的内容展示几个例子来说明这个概念。
在PL/SQL嵌套基本LOOP语句的语法如下:
LOOP
Sequence of statements1
LOOP
Sequence of statements2 END LOOP; END LOOP;
在PL/SQL 循环FOR语句嵌套的语法如下:
FOR counter1 IN initial_value1 .. final_value1 LOOP sequence_of_statements1 FOR counter2 IN initial_value2 .. final_value2 LOOP sequence_of_statements2 END LOOP; END LOOP;
在Pascal嵌套WHILE 循环语句的语法如下:
WHILE condition1 LOOP
sequence_of_statements1
WHILE condition2 LOOP
sequence_of_statements2
END LOOP; END LOOP;
示例:
下面的程序使用一个基本嵌套循环,找出2-100中的素数:
DECLARE
i number(3); j number(3); BEGIN i := 2; LOOP j:= 2; LOOP exit WHEN ((mod(i, j) = 0) or (j = i)); j := j +1; END LOOP; IF (j = i ) THEN dbms_output.put_line(i || ' is prime'); END IF; i := i + 1; exit WHEN i = 50; END LOOP; END; /
当上述代码在SQL提示符执行时,它产生了以下结果:
2 is prime 3 is prime 5 is prime 7 is prime 11 is prime 13 is prime 17 is prime 19 is prime 23 is prime 29 is prime 31 is prime 37 is prime 41 is prime 43 is prime 47 is prime PL/SQL procedure successfully completed.