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

什么是决策陈述?

决策语句是决定流程控制的语句 SQL 根据条件选择语句。它使程序员能够更好地控制阻止特定代码的执行(图 1)或根据条件选择所需的代码(图 2)。以下是“决策语句”的图示。

决策陈述图
决策陈述图

决策陈述的类型:

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

  • IF-THEN
  • 如果-那么-否则
  • IF-THEN-ELSIF
  • 嵌套IF
  • 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 时打印一条消息。为此,我们将执行以下代码

为了在数字值大于 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;
/

代码说明:

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

代码输出:

Program started.
Program completed.

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

为了在给定字符为元音时打印消息,我们执行以下代码。

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

代码说明:

  • 代码第 2 行: 将变量“a”声明为大小为“1”的数据类型“CHAR”,并用值“u”初始化它。
  • 代码第 4 行: 检查条件,变量“a”是否存在于列表中(“A”、“E”、“I”、“O”、“U”)。
  • 在比较之前,“a”的值已转换为大写,以使比较不区分大小写。
  • 代码第 5 行: 如果列表中存在“a”,则会打印语句“该字符是英文元音”。如果条件不成立,则此程序不会给出任何输出,因为在 IF-THEN 块之外我们尚未发出任何打印语句。

代码输出:

The character is in English Vowels

IF-THEN-ELSE 语句

  • IF-THEN-ELSE 语句主要用于根据条件在两种方案之间进行选择。
  • 以下是IF-THEN-ELSE语句的语法表示。

IF-THEN-ELSE 语句的语法:

IF <condition: returns Boolean>
THEN
	-executed only if the condition returns TRUE
	<action_blockl>
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 number1); 
END IF;
dbms_output.put_line (‘Program completed.’);
END;
/

代码说明:

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

代码输出:

Program started.
a is odd number
Program completed.

IF-THEN-ELSIF 语句

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

备注:此条件语句中的 ELSE 块是可选的。如果没有 ELSE 块,并且不满足任何条件,则控制器将跳过所有操作块并开始执行代码的剩余部分。

IF-THEN-ELSIF 语句的语法:

IF <conditionl: returns Boolean>
THEN
-executed only if the condition returns TRUE <
action_blockl>
ELSIF <condition2 returns Boolean> <
action_block2>
ELSIF <condition3:returns Boolean> <
action_block3>
ELSE —optional 
<action_block_else>
END if;
  • 在上面的语法中,控件将执行仅当条件 1 返回时。
  • 如果条件 1 不满足,则控制器将检查条件 2。
  • 在以下两种情况下控制器将退出 IF 语句。
    • 当控制器发现任何返回的条件时在这种情况下,相应的action_block将被执行,并且控制器将退出该IF语句块并开始执行剩余的代码。
    • 当所有条件均不满足时,则 then 控制器将执行 ELSE 块(如果存在),然后退出 IF 语句。

请注意: 每当条件计算结果为“NULL”时,SQL 就会将“NULL”视为“FALSE”。

例如1: 无 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;
/

代码说明:

  • 代码行 2:将变量“mark”声明为“NUMBER”数据类型,并用值“55”初始化它。
  • 代码行4:打印语句“程序已启动”。
  • 代码行5:检查条件1,'mark'是否大于或等于70。
  • 代码行 7:由于条件 1 失败,因此检查条件 2“70>mark>=40”。
  • 代码行 8:条件2返回,因此将打印消息“B 级”。
  • 代码行12:打印语句“程序完成”。
  • 在这种情况下,条件 3 'mark < 35' 将被跳过,因为控制器发现一个返回的条件在条件3之前。

代码输出:

Program started.
Grade B
Program completed.

例子2:使用 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;
/

代码说明:

  • 代码行 2:将变量“mark”声明为“NUMBER”数据类型,并用值“25”初始化它。
  • 代码行4:打印语句“程序已启动”。
  • 代码行 5:检查条件 1,‘mark’是否大于或等于 70。
  • 代码行 7:由于条件 1 失败,因此检查条件 2“70>mark>=40”。
  • 代码行 8:由于条件 2 失败,因此检查条件 3“40>mark>=35”。
  • 代码行 11:由于所有条件均未满足,控制现在将检查 ELSE 块是否存在,并且它将从 ELSE 块打印消息“无等级”。
  • 代码行14:打印语句“程序完成”。

代码输出:

Program started.
No Grade 
Program completed.

NESTED-IF 语句

  • NESTED-IF 语句基本上允许程序员将一个或多个“IF”条件放在另一个“IF”条件中除了正常的陈述之外。
  • 每个“IF”条件都应该有一个单独的“END IF”语句,标记该特定条件的范围结束。
  • “IF”语句将把最近的“END IF”语句视为该特定条件的端点。
  • NESTED-IF 的图形表示如下图所示。

NESTED-IF 语句

NESTED-IF 语句

IF <conditionl: 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_blockl ends>
END IF; —END IF corresponds to condition1

语法解释:

  • 在上面的语法中,外部 IF 在其操作块中包含一个以上 IF 语句。
  • 条件1返回,然后控制将执行并检查条件1。
  • 如果条件2也返回, 然后也将被处决。
  • 如果条件2的计算结果为那么 SQL 将跳过。

这里我们将看到一个嵌套 If 的示例 –

嵌套 If 语句的示例:三个数字中的最大者

在此示例中,我们将使用 Nested-If 语句打印三个数字中最大的一个。数字将在声明部分分配,如下面的代码所示,即 Number= 10,15、20 和 XNUMX,并使用 nested-if 语句获取最大数字。

DECLARE 
a NUMBER :=10; 
b NUMBER :=15; 
c NUMBER :=20;
BEGIN
dbms_output.put_line(‘Program started.' );
IF( a > b)THEN
/*Nested-if l */
	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;
/

代码说明:

  • 代码行 2:将变量“a”声明为“NUMBER”数据类型,并将其初始化为值“10”。
  • 代码行 3:将变量“b”声明为“NUMBER”数据类型,并用值“15”初始化它。
  • 代码行 4:将变量“c”声明为“NUMBER”数据类型,并用值“20”初始化它。
  • 代码第 6 行:打印语句“程序已启动”(第 6 行)。
  • 代码第 7 行:检查条件 1,‘a’是否大于‘b’(第 7 行)。
  • 代码第 10 行:如果“a”大于“b”,则“nested-if 1”中的条件将检查“a”是否大于“c”(第 10 行)。
  • 代码第 13 行:如果 'a' 仍然大于,则将打印消息 'A 最大'(第 11 行)。否则,如果条件 2 失败,则将打印 'C 最大'(第 13 行)。
  • 代码第 18 行:如果条件 1 返回 false,则“嵌套如果 2”中的条件将检查“b”是否大于“c”(第 18 行)。
  • 代码第 21 行:如果“b”大于“c”,则会打印消息“B 最大”(第 19 行),否则如果条件 2 失败,则会打印“C 最大”(第 21 行)。
  • 代码第24行:打印语句“程序完成”(第24行)。

代码输出:

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

总结

在本章中,我们学习了不同的决策语句及其语法和示例。下表总结了我们讨论过的各种条件语句。

商品描述 用法
IF-THEN 检查布尔条件,如果“THEN”块中的 TRUE 代码将被执行。 根据条件跳过/执行特定代码。
如果-那么-否则 检查布尔条件,若为 TRUE 则执行“THEN”块中的代码,若为 false 则执行“ELSE”块中的代码。 最适合于“这个或那个”的情况。
IF-THEN-ELSIF 按顺序检查布尔条件。将执行序列中返回 TRUE 条件的第一个块。如果序列中没有任何条件为 TRUE,则执行“ELSE”块中的代码。 大多用于从两个以上的方案中进行选择。
嵌套IF 允许一个或多个 IF-THEN 或 IF-THEN-ELSIF 语句位于另一个 IF-THEN 或 IF-THEN-ELSIF 语句中。 主要用于嵌套条件的情况。