Oracle PL/SQL IF THEN ELSE 语句:ELSIF、NESTED-IF

⚡ 智能摘要

PL/SQL 决策语句根据布尔条件控制运行哪些代码。 Oracle 提供 IF-THEN、IF-THEN-ELSE、IF-THEN-ELSIF 和 NESTED-IF,因此程序可以跳过一个代码块,在两条路径之间进行选择,或者从多个备选方案中选择一个。

  • 🔀 目的: 返回 TRUE 或 FALSE 的条件决定执行流程。
  • 如果-那么: 仅当条件为真时才执行代码块,否则跳过。
  • ↔️ 如果-那么-否则: 在两个方框中选择一个,一个代表真,一个代表假。
  • 🪜 如果-那么-否则如果: 按顺序测试条件,并运行第一个为真(TRUE)的条件,还可以选择运行 ELSE 条件。
  • 🧩 嵌套条件语句: 在 IF 语句中嵌套另一个 IF 语句,以实现组合条件。
  • ⚠️ 空规则: 计算结果为 NULL 的条件将被视为 FALSE。
  • 🔚 终结者: 每个 IF 语句都必须以匹配的 END IF 语句结束。

Oracle PL/SQL IF THEN ELSE ELSIF

什么是决策陈述?

决策声明决定了流量控制 SQL 基于条件的语句。它们使程序员能够更好地控制特定代码块的执行,或者根据条件选择所需的代码块。下图展示了决策语句的示意图。

决策陈述图
决策陈述图

决策陈述的类型: Oracle 提供以下类型。

  • IF-THEN
  • 如果-那么-否则
  • IF-THEN-ELSIF
  • 嵌套IF
  • 案例
  • 搜查案件

本教程涵盖 IF 语句的各种变体。CASE 语句和搜索 CASE 语句将在后续章节中介绍。 PL/SQL CASE 语句 指南。

IF-THEN 语句

IF-THEN 语句用于仅在满足特定条件时才执行特定代码段。该条件应产生一个结果。 布尔 (真/假)值。这是一个基本的条件语句,允许 Oracle 根据预定义的条件执行或跳过一段代码。

IF-THEN语句的语法:

IF <condition: returns Boolean>
THEN
-executed only if the condition returns TRUE
<action_block>
END IF;
  • 在上面的语法中,关键字“IF”后面跟着一个评估结果为“TRUE”或“FALSE”的条件。
  • 该控件执行仅当条件返回时。
  • 如果条件评估结果为SQL 跳过了并开始执行“END IF”块之后的代码。

注意: 当条件评估结果为“NULL”时,SQL 将“NULL”视为“FALSE”。

例如1: 在这个例子中,当数字大于 100 时,我们会打印一条消息。

DECLARE
a NUMBER := 10;
BEGIN
dbms_output.put_line('Program started.');
IF( a > 100 ) THEN
dbms_output.put_line('a is greater than 100');
END IF;
dbms_output.put_line('Program completed.');
END;
/

Code 说明:

  • Code 第 2 行:将变量“a”声明为“NUMBER”数据类型,并将其初始化为值“10”。
  • Code 第 4 行:打印语句“程序已启动”。
  • Code 第 5 行:检查条件,变量“a”是否大于“100”。
  • Code 第 6 行:如果 'a' 大于 '100',则打印“a 大于 100”。如果 'a' 小于或等于 100,则条件不成立,忽略打印语句。
  • Code 第 8 行:打印语句“程序完成”。

Code 输出:

Program started.
Program completed.

例如2: 在这个例子中,如果给定的字母是英语元音(A、E、I、O、U),我们就打印一条消息。

DECLARE
a CHAR(1) := 'u';
BEGIN
IF UPPER(a) in ('A','E','I','O','U' ) THEN
dbms_output.put_line('The character is in English Vowels');
END IF;
END;
/

Code 说明:

  • Code 第2行: 声明变量“a”为“CHAR”类型,大小为“1”,并初始化其值为“u”。
  • Code 第4行: 检查变量“a”是否存在于列表('A'、'E'、'I'、'O'、'U')中。为了使比较不区分大小写,'a' 的值在比较前会转换为大写。
  • Code 第5行: 如果列表中存在字母“a”,则打印“该字符属于英语元音字母”。如果条件不成立,则程序不输出任何内容,因为IF-THEN代码块之外没有其他打印语句。

Code 输出:

The character is in English Vowels

IF-THEN-ELSE 语句

IF-THEN-ELSE 语句用于根据条件在两个选项中进行选择。以下是其语法。

IF-THEN-ELSE 语句的语法:

IF <condition: returns Boolean>
THEN
-executed only if the condition returns TRUE
<action_block1>
ELSE
-execute if the condition failed (returns FALSE)
<action_block2>
END IF;
  • 关键字“IF”后面跟着一个条件,该条件的计算结果为“TRUE”或“FALSE”。
  • 控制执行仅当条件返回时。
  • 如果条件评估结果为SQL 执行。
  • 无论如何,两个操作块中总会有一个被执行。

注意: 当条件评估结果为“NULL”时,SQL 将“NULL”视为“FALSE”。

例如1: 在这个例子中,我们会输出给定数字是奇数还是偶数。

DECLARE
a NUMBER:= 11;
BEGIN
dbms_output.put_line ('Program started');
IF( mod(a,2)=0) THEN
dbms_output.put_line('a is even number');
ELSE
dbms_output.put_line('a is odd number');
END IF;
dbms_output.put_line ('Program completed.');
END;
/

Code 说明:

  • Code 第 2 行:将变量“a”声明为“NUMBER”数据类型,并将其初始化为值“11”。
  • Code 第 4 行:打印语句“程序已启动”。
  • Code 第 5 行:检查变量“a”除以“2”的模是否为 0。
  • Code 第 6 行:如果为“0”,则打印“a 是偶数”。
  • Code 第 7 行:如果模值不等于“0”,则条件返回因此,会打印出“a 是奇数”。
  • Code 第 10 行:打印语句“程序完成”。

Code 输出:

Program started.
a is odd number
Program completed.

IF-THEN-ELSIF 语句

  • IF-THEN-ELSIF 语句用于从一组备选方案中选择一个方案,其中每个方案都有自己的条件。
  • 返回的第一个条件执行该条件,其余条件将被跳过。
  • IF-THEN-ELSIF 语句可以包含一个“ELSE”块,如果所有条件都不满足,则执行该块。

注意: ELSE 代码块是可选的。如果没有 ELSE 代码块,且所有条件均不满足,则控制器会跳过所有操作代码块,并执行剩余的代码。

IF-THEN-ELSIF 语句的语法:

IF <condition1: returns Boolean>
THEN
-executed only if the condition returns TRUE
<action_block1>
ELSIF <condition2: returns Boolean> THEN
<action_block2>
ELSIF <condition3: returns Boolean> THEN
<action_block3>
ELSE --optional
<action_block_else>
END IF;
  • 控制执行仅当 condition1 返回。
  • 如果条件 1 不满足,控制器检查条件 2,依此类推。
  • 当控制器找到返回值的条件时,它会退出 IF 语句。并运行匹配的操作块,或者当没有匹配的操作块时,运行 ELSE 块(如果存在)。

注意: 当条件评估结果为“NULL”时,SQL 将“NULL”视为“FALSE”。

示例 1:没有 ELSE 块。 在这个例子中,我们根据给定的分数打印等级,没有 else 条件(分数 >= 70 等级 A,分数 >= 40 且分数 < 70 等级 B,分数 >= 35 且分数 < 40 等级 C)。

DECLARE
mark NUMBER := 55;
BEGIN
dbms_output.put_line('Program started.');
IF( mark >= 70) THEN
dbms_output.put_line('Grade A');
ELSIF(mark >= 40 AND mark < 70) THEN
dbms_output.put_line('Grade B');
ELSIF(mark >= 35 AND mark < 40) THEN
dbms_output.put_line('Grade C');
END IF;
dbms_output.put_line('Program completed.');
END;
/

Code 说明:

  • Code 第 2 行:将变量“mark”声明为“NUMBER”数据类型,并将其初始化为值“55”。
  • Code 第 4 行:打印语句“程序已启动”。
  • Code 第 5 行:检查条件 1,即“mark”是否大于或等于 70。
  • Code 第 7 行:由于条件 1 不成立,因此检查条件 2“70 > mark >= 40”。
  • Code 第 8 行:条件 2 返回因此,打印出的信息是“B级”。
  • Code 第 12 行:打印语句“程序完成”。条件 3“mark < 35”被跳过,因为已经找到一个 TRUE 条件。

Code 输出:

Program started.
Grade B
Program completed.

示例 2:使用 ELSE 块。 在这个例子中,我们根据给定的分数打印等级,并附加一个 else 条件(分数 >= 70 为 A 级,分数 >= 40 且分数 < 70 为 B 级,分数 >= 35 且分数 < 40 为 C 级,否则为“无等级”)。

DECLARE
mark NUMBER := 25;
BEGIN
dbms_output.put_line('Program started.');
IF( mark >= 70) THEN
dbms_output.put_line('Grade A');
ELSIF(mark >= 40 AND mark < 70) THEN
dbms_output.put_line('Grade B');
ELSIF(mark >= 35 AND mark < 40) THEN
dbms_output.put_line('Grade C');
ELSE
dbms_output.put_line('No Grade');
END IF;
dbms_output.put_line('Program completed.');
END;
/

Code 说明:

  • Code 第 2 行:将变量“mark”声明为“NUMBER”数据类型,并将其初始化为值“25”。
  • Code 第 4 行:打印语句“程序已启动”。
  • Code 第 5 行:检查条件 1,即“mark”是否大于或等于 70。
  • Code 第 7 行:由于条件 1 不成立,因此检查条件 2“70 > mark >= 40”。
  • Code 第 9 行:由于条件 2 不成立,因此检查条件 3“40 > mark >= 35”。
  • Code 第 11 行:由于所有条件均未满足,控制程序检查 ELSE 块并打印“无成绩”。
  • Code 第 14 行:打印语句“程序完成”。

Code 输出:

Program started.
No Grade
Program completed.

NESTED-IF 语句

  • 嵌套 IF 语句允许程序员将一个或多个 IF 条件放在另一个 IF 条件内部。 。
  • 每个“IF”条件都应该有一个单独的“END IF”语句,该语句标志着该特定条件的作用域结束。 。
  • “IF”语句会将最近的“END IF”视为该条件的终点。
  • 嵌套IF的图形表示如下所示。

嵌套 IF 语句流程

嵌套 IF 语句结构

IF <condition1: returns Boolean>
THEN
--executed only if the condition returns TRUE
<action block1 starts>
IF <condition2: returns Boolean>
THEN
<action_block2>
END IF; --END IF corresponds to condition2
<action_block1 ends>
END IF; --END IF corresponds to condition1

语法解释:

  • 外部 IF 语句在其执行块中包含另一个 IF 语句。
  • 如果条件1返回控制执行并检查条件2。
  • 如果 condition2 也返回, 然后也被执行。
  • 如果 condition2 的计算结果为,SQL 跳过。

嵌套 IF 语句示例:三个数中最大的一个。 在这个例子中,我们使用嵌套的if语句打印三个数字中的最大值。这三个数字在声明部分被赋值(Number = 10、15 和 20),最大值是通过嵌套的if语句获取的。

DECLARE
a NUMBER := 10;
b NUMBER := 15;
c NUMBER := 20;
BEGIN
dbms_output.put_line('Program started.');
IF( a > b)THEN
/*Nested-if 1 */
dbms_output.put_line('Checking Nested-IF 1');
IF( a > c ) THEN
dbms_output.put_line('A is greatest');
ELSE
dbms_output.put_line('C is greatest');
END IF;
ELSE
/*Nested-if2 */
dbms_output.put_line('Checking Nested-IF 2');
IF( b > c ) THEN
dbms_output.put_line('B is greatest');
ELSE
dbms_output.put_line('C is greatest');
END IF;
END IF;
dbms_output.put_line('Program completed.');
END;
/

Code 说明:

  • Code 第 2-4 行:将变量“a”、“b”和“c”声明为“NUMBER”,并分别用 10、15 和 20 初始化它们。
  • Code 第 6 行:打印语句“程序已启动”。
  • Code 第 7 行:检查条件 1,'a' 是否大于 'b'。
  • Code 第 10 行:如果 'a' 大于 'b',则嵌套 if 1 检查 'a' 是否大于 'c'。
  • Code 第 11-13 行:如果 'a' 仍然更大,则打印 'A 最大';否则打印 'C 最大'。
  • Code 第 18 行:如果条件 1 返回 false,嵌套条件 2 检查 'b' 是否大于 'c'。
  • Code 第 19-21 行:如果 'b' 大于 'c',则打印 'B 最大';否则打印 'C 最大'。
  • Code 第 24 行:打印语句“程序完成”。

代码输出:

Program started.
Checking Nested-IF 2
C is greatest
Program completed.

决策陈述的比较

下表总结了所讨论的各种条件语句,以便针对特定情况选择合适的语句。

类型 描述 用法
IF-THEN 检查布尔条件;如果为真,则执行“THEN”块中的代码。 根据条件跳过或执行特定代码块。
如果-那么-否则 检查布尔条件;如果为真,则执行“THEN”块;如果为假,则执行“ELSE”块。 最适用于“二选一”的情况。
IF-THEN-ELSIF 按顺序检查条件。首先执行返回 TRUE 的代码块。如果没有返回 TRUE 的代码块,则执行 'ELSE' 代码块。 用于从两个以上的选项中进行选择。
嵌套IF 允许在一个语句内部使用一个或多个 IF-THEN 或 IF-THEN-ELSIF 语句。 主要用于嵌套条件语句中。

常见问题

ELSIF 语句用于测试一系列互斥条件。嵌套的 IF 语句将一个条件放在另一个条件之内,因此内部条件只有在外部条件为真后才会执行。

如果条件判断结果为 NULL,则会被视为 FALSE,因此其对应的 THEN 代码块会被跳过。当比较值可能为 NULL 时,这一点尤为重要,因为分支的执行方式可能与初学者的预期有所不同。

当一个表达式需要与多个固定值进行比较时,CASE 语句更清晰易懂。IF-THEN-ELSIF 语句则适用于不相关的范围条件。两者都可以表达相同的逻辑,但 CASE 语句在值匹配方面更易读。

是的。人工智能可以将嵌套的 IF 语句简化为 ELSIF 链或 CASE 语句,并识别出永远无法满足的条件。务必测试重写后的版本,因为条件顺序的改变可能会影响执行的分支。

END IF 标记条件代码块的结束位置,这在嵌套 IF 语句时至关重要。如果没有它,编译器将无法判断哪些语句属于某个条件,从而引发错误。

总结一下这篇文章: