Oracle PL/SQL 循环示例
⚡ 智能摘要
PL/SQL 循环用于重复执行一段代码,次数可根据需要指定。PL/SQL 提供基本循环、FOR 循环和 WHILE 循环,并分别由 CONTINUE、EXIT、EXIT WHEN 和 GOTO 语句控制。此外,循环还可以添加标签,以便清晰地管理嵌套结构。
什么是循环?
循环允许程序中的特定代码执行所需的次数。在本教程中,我们将探讨 PL/SQL 中的循环概念以及循环中的控制流程。
循环概念简介
循环的概念在编程中具有以下优点:
- 代码重用性。
- 代码体积减小。
- 控制流程简便。
- 降低复杂性。
下图显示了厕所。ping 概念。
在上图中,循环条件会被检查,只要满足条件,执行块就会运行。
在每次迭代中,决定循环条件的循环计数器变量应该发生变化,以使控制流退出循环。在某些情况下,该计数器会根据预定义的计数进行递增或递减;而在其他情况下,它是一个搜索条件,会持续执行代码块,直到满足条件为止。
循环控制语句
在学习循环概念之前,首先需要学习循环控制语句。这些语句控制着循环内部的执行流程。
CONTINUE
此关键字指示 PL/SQL 引擎,当在循环中遇到 CONTINUE 时,跳过执行块中剩余的代码,并立即开始下一次迭代。这主要用于需要跳过某些迭代次数的循环内代码的情况。
退出/退出时间
此关键字指示 PL/SQL 引擎立即退出当前循环。在嵌套循环中,内层循环中的 EXIT 仅退出内层循环,不会退出外层循环。'EXIT WHEN' 后跟一个返回布尔值的表达式;如果结果为 TRUE,则控制程序退出。
GOTO
此语句将控制权转移到一个带标签的语句(“GOTO ;”)。它有以下限制:
- 控制转移只能在子程序内完成。
- 无法将控制权从异常处理部分转移到执行部分。
除非别无选择,否则不建议使用此语句,因为代码控制 trac当控制权从一个部分转移到另一个部分时,可执行性就会变得非常难以保证。
PL/SQL 中的循环类型
PL / SQL 提供以下三种类型的循环:
- 基本循环语句
- For 循环语句
- While 循环语句
下表对比了基本循环之前的三种情况。
| 循环 | 退出标准 | 最佳使用时机 |
|---|---|---|
| 基本循环 | 在代码块中显式地使用 EXIT 语句 | 退出并非基于固定的计数或条件 |
| FOR循环 | 计数器到达其范围末端 | 迭代次数是预先已知的。 |
| WHILE 循环 | 条件变为假 | 当某个条件成立时,循环应该运行。 |
基本循环语句
这是 PL/SQL 中最简单的循环结构。执行块以关键字“LOOP”开始,以“END LOOP”结束。退出条件应在执行块内部给出,以便控制程序退出循环,并且必须显式地使用关键字“EXIT”。
LOOP <execution block starts> <EXIT condition based on developer criteria> <execution_block_ends> END LOOP;
语法解释:
- 关键字“LOOP”表示循环的开始,“END LOOP”表示循环的结束。
- 执行块包含所有需要运行的代码,包括 EXIT 条件。
- 执行部分可以包含任何可执行语句。
注意: 没有 EXIT 关键字的基本循环语句是一个永不停止的无限循环。
例如1: 在这个例子中,我们使用基本的循环语句打印 1 到 5 之间的数字。
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; /
Code 说明:
- Code 第2行: 声明变量“a”为“NUMBER”类型,并将其初始化为值“1”。
- Code 第4行: 打印语句“程序已启动”。
- Code 第5行: 关键字“LOOP”标志着循环的开始。
- Code 第6行: 打印“a”的值。
- Code 第7行: 将'a'的值加1。
- Code 第8行: 检查“a”的值是否大于 5。
- Code 第9行: 关键字“END LOOP”标志着执行块的结束。
- 第 6 行到第 8 行继续执行,直到“a”达到 6,此时条件返回 TRUE,控制退出循环。
- Code 第10行: 打印“程序完成”的声明。
循环标记
在 PL/SQL 中,循环可以添加标签。标签应放在“<<”和“>>”之间。给循环添加标签,尤其是在嵌套循环中,可以提高代码的可读性。标签可以放在 EXIT 命令中以退出特定循环,因此,可以通过在 EXIT 命令后跟外部循环标签来直接退出嵌套结构的外部循环。
<<OUTER_LOOP>> LOOP <execution_block_starts> . <<INNER_LOOP>> LOOP --inner <execution_part> END LOOP; . <execution_block_ends> END LOOP;
语法解释:
- 外层环内还有一层环。
- '< >' 和 '< >' 是这些循环的标签。
例如1: 在这个例子中,我们使用基本的循环语句打印从 1 开始的数字。每个数字打印的次数与其值相同。序列的上限在声明部分中设定。我们使用标签的概念来实现这一点。
DECLARE a NUMBER:= 0; b NUMBER; upper_limit NUMBER := 4; BEGIN dbms_output.put_line('Program started.'); <<outer_loop>> LOOP a:= a+1; b:= 1; <<inner_loop>> LOOP EXIT outer_loop WHEN a > upper_limit; dbms_output.put_line(a); b:= b+1; EXIT inner_loop WHEN b>a; END LOOP; END LOOP; dbms_output.put_line('Program completed.'); END; /
Code 说明:
- Code 第 2-3 行: 将变量“a”和“b”声明为“NUMBER”数据类型。
- Code 第4行: 声明变量“upper_limit”为“NUMBER”类型,值为“4”。
- Code 第6行: 打印语句“程序已启动”。
- Code 第7行: 外层循环被标记为“outer_loop”。
- Code 第9行: ‘a’ 的值增加 1。
- Code 第11行: 内层循环被标记为“inner_loop”。
- Code 第13行: 退出条件检查 'a' 是否大于 'upper_limit' 值。如果不是,则继续执行;否则直接退出外层循环。
- Code 第14行: 打印“b”的值。
- Code 第15行: 将'b'的值加1。
- Code 第16行: 退出条件检查'b'是否大于'a'。如果大于,则退出内层循环。
- Code 第19行: 打印“程序完成”的声明。







