Oracle PL/SQL LOOP 示例

什么是循环?

循环允许程序中的某一部分代码被执行所需的次数。

在本教程中,我们将了解 PL/SQL 中的循环概念以及循环中的控制流。

循环概念简介

循环概念在编码中提供了以下优势。

  • 代码可重用性
  • 减少代码量
  • 易于控制流程
  • 降低复杂性

下图以图解方式展示了循环概念

Oracle PL/SQL LOOP

在上图中,将检查循环条件,只要循环条件满足,执行块就会被执行。

在每次迭代中,实际决定循环条件的循环计数器变量应进行修改,以使控制退出循环。在某些情况下,此循环计数器变量是用于预定义计数的增量/减量运算符,而在某些情况下,它是用于继续执行块直到满足条件的搜索条件。

循环控制语句

在学习循环概念之前,必须学习循环控制语句。循环控制语句是实际控制循环内执行流程的语句。下面是关于循环控制语句的详细描述。

CONTINUE

此关键字向 PL/SQL 引擎发送指令,当 PL/SQL 引擎在循环中遇到此关键字时,它将跳过执行代码块中剩余的代码,并立即开始下一次迭代。这主要用于当循环内的代码希望跳过某些迭代值时。

EXIT / EXIT WHEN

此关键字向 PL/SQL 引擎发送指令,当 PL/SQL 引擎遇到此关键字时,它将立即退出当前循环。如果 PL/SQL 引擎在嵌套循环中遇到 EXIT,它将退出定义它的循环,即在嵌套循环中,在内层循环中给出 EXIT 只会从内层循环退出控制,而不会从外层循环退出。“EXIT WHEN”后跟一个给出布尔结果的表达式。如果结果为 TRUE,则控制将退出。

GOTO

此语句将控制转移到带标签的语句(“GOTO

  • 控制转移只能在子程序内进行。
  • 控制转移不能从异常处理部分到执行部分。

除非别无选择,否则不建议使用此语句,因为由于控制从一个部分转移到另一个部分,代码控制的可追溯性在程序中会非常困难。

PL/SQL 中的循环类型

PL/SQL 提供以下三种循环

基本循环语句

此循环语句是 PL/SQL 中最简单的循环结构。执行块以关键字“LOOP”开始,以关键字“END LOOP”结束。

退出条件应在执行块内给出,以便控制退出循环。

它需要显式地在执行部分给出 EXIT 关键字以退出循环。

Basic Loop Statement

 LOOP
<execution block starts>
<EXIT condition based on developer criteria> 
<execution_block_ends>
END LOOP;

语法说明

  • 在上面的语法中,关键字“LOOP”标记循环的开始,“END LOOP”标记循环的结束。
  • 执行块包含所有需要执行的代码,包括 EXIT 条件。
  • 执行部分可以包含任何执行语句。

注意:没有 EXIT 关键字的基本循环语句将是无限循环,永不停止。

示例 1:在此示例中,我们将使用基本循环语句打印从 1 到 5 的数字。为此,我们将执行以下代码。

Basic Loop Statement

DECLARE 
a NUMBER:=1; 
BEGIN
dbms_output.put_line('Program started.');
LOOP
dbms_output.put_line(a);
a:=a+1;
EXIT WHEN a>5;
END LOOP;
dbms_output.put_line('Program completed');
END:
/

代码解释

  • 代码行 2:将变量“a”声明为“NUMBER”数据类型,并将其初始化为值“1”。
  • 代码行 4:打印语句“程序已开始”。
  • 代码行 5:关键字“LOOP”标记循环的开始。
  • 代码行 6:打印变量“a”的值。
  • 代码行 7:将变量“a”的值加 1。
  • 代码行 8:检查变量“a”的值是否大于 5。
  • 代码行 9:关键字“END LOOP”标记执行块的结束。
  • 从第 6 行到第 8 行的代码将继续执行,直到“a”达到 6,因为条件将返回 TRUE,控制将退出循环。
  • 代码行 10:打印语句“程序已完成”。

循环标签

在 PL/SQL 中,循环可以被标记。标签应包含在“<<”和“>>”之间。循环的标记,尤其是在嵌套循环代码中,将提供更好的可读性。标签可以用于 EXIT 命令以退出该特定循环。使用标签,可以通过在 EXIT 命令后跟外部循环标签,将控制直接退出嵌套循环的外部循环,从循环内的任何位置。

Labeling of Loops

<<OUTER_LOOP>>
LOOP 
	<execution_block_starts>
	.
	<<INNER_LOOP>>
	LOOP --inner
		<execution_part>
	END LOOP;
	.
	<executi_block_ends>
END LOOP;

语法说明

  • 在上面的语法中,外部循环中有一个内部循环。
  • “<>”和“<>”是这些循环的标签。

示例 1:在此示例中,我们将使用基本循环语句打印从 1 开始的数字。每个数字将被打印为其值的次数。系列的上限固定在程序声明部分。让我们学习如何使用标签概念来实现这一点。为此,我们将执行以下代码。

Labeling of LoopsLabeling of Loops

DECLARE
a NUMBER:=0;
b NUMBER;
upper-limit NUMBER :=4;
BEGIN
dbms_output.put_line(‘Program started.' ); 
«outerloop»‭	‬
LOOP 
a:=a+1;
b:=l;
«inner loop»
LOOP
EXIT outer_loop WHEN a > upper_limit;
dbms_output.put_line(a);
b:=b+l;
EXIT inner_loop WHEN b>a;
END LOOP;
END LOOP;
dbms_output.put_line('Program completed.');
END;
/

代码解释

  • 代码行 2-3:将变量“a”和“b”声明为“NUMBER”数据类型。
  • 代码行 4:将变量“upper_limit”声明为“NUMBER”数据类型,值为“4”。
  • 代码行 6:打印语句“程序已开始”。
  • 代码行 7:外部循环被标记为“outer_loop”。
  • 代码行 9:将变量“a”的值加 1。
  • 代码行 11:内部循环被标记为“inner_loop”。
  • 代码行 13:EXIT 条件,检查变量“a”的值是否大于“upper_limit”值。如果不是,它将继续执行,否则它将直接退出外部循环。
  • 代码行 14:打印变量“b”的值。
  • 代码行 15:将变量“b”的值加 1。
  • 代码行 16:EXIT 条件,检查变量“b”的值是否大于“a”。如果是,则控制将从内部循环退出。
  • 代码行 14:打印语句“程序已完成”。

摘要

循环 基本循环
退出条件 当在执行部分遇到关键字“EXIT”时退出。
用途 当退出不基于任何特定条件时,使用此方法效果很好。