当需要根据 SPL 变量或单一表达式的值从许多分支中取用一个时,使用 CASE 语句。CASE 语句是对 IF 语句的快速替换。
语法
元素 |
描述 |
限制 |
语法 |
constant_expr |
指定精确值的表达式 |
必须是精确数值、引用字符串、精确日期时间或精确时间间隔。数据类型必须与数据 value_expr 相一致
|
常量表达式 |
value_expr |
返回值的表达式 |
SPL 变量或者返回值或 NULL 的其它类型的表达式。该数据类型不能是大对象(BLOB 、BYTE 、CLOB
、TEXT)、集合或者用户定义的 OPAQUE 或 DISTINCT 类型。在内置 OPAQUE 类型中,只有 BOOLEAN 和 LVARCHAR
是有效的。
|
表达式 |
用法
可以使用 CASE 语句在 SPL 例程中创建一组条件分支。WHEN 和 ELSE 子句都是可选的,但您必须提供其中一个或另一个。如果既不指定 WHEN 子句也不指定
ELSE 子句。则会收到语法错误消息。
- 如果不包含 WHEN 子句也不包含 ELSE 子句,则 CASE 语句由于语法错误而失败。
- 如果不包含 ELSE 子句,但是 WHEN 子句没有指定一个与 value_expr 相匹配的 constant expr t,则 CASE
语句在例程执行时产生错误 -26062 并失败。
不要将 CASE 语句和 SQL 的 CASE 表达式混淆。(CASE 表达式支持作为 CASE 语句的同一关键字。但是使用不同的语法和语义计算指定的
conditions 。CASE 表达式会返回一个值或 NULL,如 CASE 表达式
中描述。)
数据库服务器如何执行 CASE 语句
数据库服务器按一下操作的顺序的执行 CASE 语句:
- 数据库服务器计算 value_expr 表达式。
- 如果得到的值与在 WHEN 子句的 constant_expr 参数中指定的精确值相匹配,则数据库服务器执行跟随该 WHEN 子句中的 THEN
关键字的语句块。
- 如果计算 value_expr 参数得到的值与多个 WHEN 子句中的 constant_expr 参数相匹配,则数据库服务器执行跟随 CASE
语句中第一个匹配的 WHEN 子句中 THEN 关键字的语句块。(在这种情况中,WHEN 子句的词法顺序可以确定 CASE 语句的结果。)如果数据库服务器执行了跟随在
THEN
关键字之后的 GOTO 语句,则数据库服务器将程序控制传递给指定的语句标签。否则,数据库服务器执行 SPL 例程中标识当前 CASE 语句结束的 END CASE
关键字后面的下一个 SPL 语句或 SQL 语句。
- 如果 value_expr 参数计算的值与任何 WHEN 子句的 constant_expr 参数中指定的精确值不匹配,并且如果 CASE
语句包含 ELSE 子句,则数据库服务器执行跟随在 ELSE 关键字的语句块。如果数据库服务器执行了跟随在 ELSE 关键字之后的 GOTO
语句,则数据库服务器将程序控制传递给指定的语句标签。否则,数据库服务器执行 SPL 例程中标识当前 CASE 语句结束的 END CASE 关键字后面的下一个 SPL
语句或
SQL 语句。
- 如果 value_expr 参数计算的值与任何 WHEN 子句的 constant_expr 参数中指定的精确值不匹配,并且如果 CASE
语句不包含 ELSE 子句,则数据库服务器发出异常,并且 CASE 语句失败,错误 -26062。SPL 例程是否终止或继续执行取决于其异常处理逻辑。
CASE 语句的此实现非常类似于GBase 8s Parallel
Server 的实现,除了当未指定 ELSE 子句且没有 WHEN 子句与 value_expr 参数相匹配时,GBase 8s Parallel Server
不会发生错误。在这种情况下,程序执行将在紧跟 CASE 语句之后的 SPL 或 SQL 语句中继续。
更随 THEN 或 ELSE 关键字的语句块可以包括在 SPL 例程的语句块中有效的任何 SQL 语句或 SPL 语句。有关更多信息,请参阅语句块。
在 CASE 语句中值表达式的计算
数据库服务器仅计算一次 value_expr 参数的值。它在开始执行 CASE 语句时计算此值。如果该参数中的指定表达式包含一个或多个 SPL
变量。并且这些变量中的任何变量的值随后在 CASE 语句中的一个语句块中修改,则数据库服务器不会重新计算 value_expr 参数的值。因此,在
value_expr 参数中指定的变量值的任何更改都不好影响 CASE 语句采用的分支。
CASE 语句的示例
在以下示例中,CASE 语句根据另一个命名为 i 的 SPL 变量的值将 SPL 变量集合(命名为 j 、k 、l 和
m)之一初始化为命名为 x 的 SPL 变量的值:
CASE i
WHEN 1 THEN LET j = x;
WHEN 2 THEN LET k = x;
WHEN 3 THEN LET l = x;
WHEN 4 THEN LET m = x;
ELSE
RAISE EXCEPTION 100; --invalid value
END CASE;
此处每个 WHEN 子句指定一个整数作为它的常量表达式,假设值表达式具有数据类型。(如果这些精确值已用引号分隔,则数据库服务器将它们视为字符值。)
下面的示例包含 WHEN 子句中对 NULL 的测试,其表达式的值和常量表达式的数据类型为 CHAR(1):
CREATE PROCEDURE case_proc( )
RETURNING CHAR(1);
DEFINE grade CHAR(1);
LET grade = 'D';
CASE grade
WHEN 'A' THEN LET grade = 'a';
WHEN 'B' THEN LET grade = 'b';
WHEN 'C' THEN LET grade = 'c';
WHEN NULL THEN LET grade = 'z';
ELSE LET grade = 'd';
END CASE;
RETURN grade;
END PROCEDURE;