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)来选择替代方案。 | 主要用于选择两个以上的替代方案。 |