Oracle PL/SQL 循环示例

⚡ 智能摘要

PL/SQL 循环用于重复执行一段代码,次数可根据需要指定。PL/SQL 提供基本循环、FOR 循环和 WHILE 循环,并分别由 CONTINUE、EXIT、EXIT WHEN 和 GOTO 语句控制。此外,循环还可以添加标签,以便清晰地管理嵌套结构。

  • 🔁 目的: 循环会多次运行一段代码,从而减少代码的大小和复杂性。
  • 🧭 循环计数器: 计数器变量决定循环条件,并且必须改变条件循环才能退出。
  • ⏭️ 继续: 跳过当前迭代的剩余部分,直接开始下一次迭代。
  • 🚪 退出/退出条件: 当布尔条件为真时,可选择性地立即退出循环。
  • 🏷️ 标签: 双尖括号内的循环标签可以让 EXIT 指令指向外部循环。
  • ♾️ 基本循环: 程序运行直到遇到明确的 EXIT 指令;如果没有 EXIT 指令,程序将无限循环。
  • 🧩 三种类型: 基本循环、FOR 循环和 WHILE 循环涵盖了常见的模式。

Oracle PL/SQL 循环

什么是循环?

循环允许程序中的特定代码执行所需的次数。在本教程中,我们将探讨 PL/SQL 中的循环概念以及循环中的控制流程。

循环概念简介

循环的概念在编程中具有以下优点:

  • 代码重用性。
  • 代码体积减小。
  • 控制流程简便。
  • 降低复杂性。

下图显示了厕所。ping 概念。

厕所ping PL/SQL 中的概念流程

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

在每次迭代中,决定循环条件的循环计数器变量应该发生变化,以使控制流退出循环。在某些情况下,该计数器会根据预定义的计数进行递增或递减;而在其他情况下,它是一个搜索条件,会持续执行代码块,直到满足条件为止。

循环控制语句

在学习循环概念之前,首先需要学习循环控制语句。这些语句控制着循环内部的执行流程。

CONTINUE

此关键字指示 PL/SQL 引擎,当在循环中遇到 CONTINUE 时,跳过执行块中剩余的代码,并立即开始下一次迭代。这主要用于需要跳过某些迭代次数的循环内代码的情况。

退出/退出时间

此关键字指示 PL/SQL 引擎立即退出当前循环。在嵌套循环中,内层循环中的 EXIT 仅退出内层循环,不会退出外层循环。'EXIT WHEN' 后跟一个返回布尔值的表达式;如果结果为 TRUE,则控制程序退出。

GOTO

此语句将控制权转移到一个带标签的语句(“GOTO ;”)。它有以下限制:

  • 控制转移只能在子程序内完成。
  • 无法将控制权从异常处理部分转移到执行部分。

除非别无选择,否则不建议使用此语句,因为代码控制 trac当控制权从一个部分转移到另一个部分时,可执行性就会变得非常难以保证。

PL/SQL 中的循环类型

PL / SQL 提供以下三种类型的循环:

下表对比了基本循环之前的三种情况。

循环 退出标准 最佳使用时机
基本循环 在代码块中显式地使用 EXIT 语句 退出并非基于固定的计数或条件
FOR循环 计数器到达其范围末端 迭代次数是预先已知的。
WHILE 循环 条件变为假 当某个条件成立时,循环应该运行。

基本循环语句

这是 PL/SQL 中最简单的循环结构。执行块以关键字“LOOP”开始,以“END LOOP”结束。退出条件应在执行块内部给出,以便控制程序退出循环,并且必须显式地使用关键字“EXIT”。

PL/SQL 中的基本循环结构

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

语法解释:

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

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

例如1: 在这个例子中,我们使用基本的循环语句打印 1 到 5 之间的数字。

基本循环打印数字 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行: 打印“程序完成”的声明。

常见问题

EXIT 语句会无条件地退出循环。EXIT WHEN 语句仅在其后的布尔表达式为真时才退出循环,这样就无需在普通的 EXIT 语句外再添加单独的 IF 语句。

标签允许内层循环中的 EXIT 指令一步退出指定的外层循环。它还能使嵌套代码更易于阅读。 tracking plain END LOOP 语句。

如果代码块没有 EXIT 语句,或者计数器始终没有达到退出条件,则循环永远不会停止。务必确保计数器始终朝着 EXIT WHEN 条件的方向变化。

通常情况下,是的。人工智能可以 trace 指示计数器是否向 EXIT 条件移动,并在循环没有可达出口时发出警告,尽管数据相关的出口仍然需要测试运行来确认。

CONTINUE 会跳过当前迭代的剩余部分,直接跳到下一次迭代。当需要忽略某些值但又不想完全退出循环时,CONTINUE 非常有用。

总结一下这篇文章: