Oracle PL/SQL 中的 CASE 语句及示例

什么是 CASE 语句?

CASE 语句类似于 IF-THEN-ELSIF 语句,它根据可用选项中的条件选择一个替代方案。

  • CASE 语句使用“选择器”而不是布尔表达式来选择序列。
  • CASE 语句中的表达式值将被视为选择器。
  • 表达式可以是任何类型(算术、变量等)。
  • 每个替代方案都分配有特定的预定义值(选择器),并且选择器值与条件表达式值匹配的替代方案将被执行。
  • 与 IF-THEN-ELSIF 不同,CASE 语句也可以用于 SQL 语句。
  • CASE 语句中的 ELSE 块包含在没有选择任何替代方案时需要执行的序列。

语法

CASE (expression)
 WHEN <valuel> THEN action_blockl;
 WHEN <value2> THEN action_block2;
 WHEN <value3> THEN action_block3;
 ELSE action_block_default;
END CASE;
  • 在上述语法中,表达式将返回一个可以是任何类型(变量、数字等)的值。
  • 每个“WHEN”子句都被视为具有“<值>”和“<操作块>”的替代方案。
  • 值与表达式匹配的“WHEN”子句将被选中,并执行相应的“<操作块>”。
  • “ELSE”块是可选的,它包含在没有替代方案匹配表达式值时需要执行的“<默认操作块>”。
  • “END”标志着 CASE 语句的结束,它是 CASE 的强制组成部分。

示例 1:使用 Case 进行算术计算

在此示例中,我们将对两个数字 55 和 5 进行算术计算。

DECLARE
a NUMBER :=55;
b NUMBER :=5;
arth_operation VARCHAR2(20) :='MULTIPLY’;
BEGIN
dbms_output.put_line(‘Program started.' );
CASE (arth_operation)
WHEN ‘ADD’ THEN dbms_output.put_line(‘Addition of the numbers are: '|| a+b );
WHEN ‘SUBTRACT' THEN dbms_output.put_line(‘Subtraction of the numbers are: '||a-b ); 
WHEN ‘MULTIPLY' THEN dbms_output.put_line(‘Multiplication of the numbers are: '|| a*b
);
WHEN ‘DIVIDE' THEN dbms_output.put_line(‘Division of the numbers are:'|| a/b);
ELSE dbms_output.put_line(‘No operation action defined. Invalid operation');
END CASE;
dbms_output.put_line(‘Program completed.' );
END;
/

代码解释

  • 代码行 2:将变量“a”声明为“NUMBER”数据类型,并将其初始化为值“55”。
  • 代码行 3:将变量“b”声明为“NUMBER”数据类型,并将其初始化为值“5”。
  • 代码行 4:将变量“arth_operation”声明为“VARCHAR2”数据类型,大小为 20,并将其初始化为值“MULTIPLY”。
  • 代码行 6:打印语句“Program started”。
  • 代码行 7:CASE 检查表达式的值。在此情况下,变量“arth_operation”的值为“MULTIPLY”。此值现在将被视为此 CASE 语句的选择器。
  • 代码行 10:“MULTIPLY”值的 WHEN 子句与选择器值匹配,因此控制器将选择此操作块,并打印消息“Multiplication of the numbers are: 275”。
  • 代码行 13:标志着 CASE 语句的结束。
  • 代码行 14:打印语句“Program completed”。

代码输出

Program started.
Multiplication of the numbers are: 275
Program completed.

搜索式 CASE 语句

搜索式 CASE 语句与 CASE 语句类似,它不使用选择器来选择替代方案,而是直接在 WHEN 子句中定义表达式。

  • 第一个满足条件的 WHEN 子句将被执行,控制器将跳过其余的替代方案。

语法

CASE
WHEN <expression1> THEN action_blockl; 
WHEN <expression2> THEN action_block2; 
WHEN <expression3> THEN action_block3; 
ELSE action_block_default;
END CASE;
  • 在上述语法中,每个 WHEN 子句都有单独的“<表达式>”和“<操作块>”。
  • 返回 TRUE 的表达式的 WHEN 子句将被执行。
  • “ELSE”块是可选的,它包含在没有替代方案满足条件时需要执行的“<默认操作块>”。
  • “END”标志着 CASE 语句的结束,它是 CASE 的强制组成部分。

示例 1:使用搜索式 Case 进行算术计算

在此示例中,我们将对两个数字 55 和 5 进行算术计算。

DECLARE a NUMBER :=55;
b NUMBER :=5;
arth_operation VARCHAR2(20) :='DIVIDE';
BEGIN
dbms_output.put_line(‘Program started.' );
CASE
WHEN arth_operation = 'ADD'
THEN dbms_output.put_line(‘Addition of the numbers are: '||a+b );
WHEN arth_operation = ‘SUBTRACT'
THEN dbms_output.put_line(‘Subtraction of the numbers are: '|| a-b);
WHEN arth_operation = ‘MULTIPLY’
THEN dbms_output.put_line(‘Multiplication of the numbers are: '|| a*b ); 
WHEN arth_operation = ’DIVIDE'
THEN dbms_output.put_line(‘Division of the numbers are: '|| a/b ):
ELSE dbms_output.put_line(‘No operation action defined. Invalid operation'); 
END CASE;
dbms_output.put_line(‘Program completed.' );
END;
/

代码解释

  • 代码行 2:将变量“a”声明为“NUMBER”数据类型,并将其初始化为值“55”。
  • 代码行 3:将变量“b”声明为“NUMBER”数据类型,并将其初始化为值“5”。
  • 代码行 4:将变量“arth_operation”声明为“VARCHAR2”数据类型,大小为 20,并将其初始化为值“DIVIDE”。
  • 代码行 6:打印语句“Program started”。
  • 代码行 7:开始 SEARCHED CASE 语句。由于其选择器值(ADD、SUBTRACT、MULTIPLY)与“arth_operation”的值不匹配,因此将跳过从第 8 行到第 13 行的代码。
  • 代码行 14:“arth_operation = ‘DIVIDE’”的 WHEN 子句表达式得到满足,表达式返回 TRUE。
  • 代码行 15:将执行 WHEN 子句的操作块,并打印消息“Division of the numbers are: 11”。
  • 代码行 17:标志着 CASE 语句的结束。
  • 代码行 18:打印语句“Program completed”。

代码输出

Program started.
Division of the numbers are: 11
Program completed.

摘要

类型 描述 用途
CASE 类似于 IF-THEN-ELSIF 语句。使用“选择器”来选择替代方案,而不是使用布尔表达式。 用于使用“选择器”从多个替代方案中进行选择
搜索式 CASE 不带实际“选择器”的 CASE 语句。相反,它包含实际条件(求值为 TRUE/FALSE)来选择替代方案。 主要用于选择两个以上的替代方案。