当需要根据 SPL 变量或单一表达式的值从许多分支中取用一个时,使用 CASE 语句。CASE 语句是对 IF 语句的快速替换。
不要将 CASE 语句和 SQL 的 CASE 表达式混淆。(CASE 表达式支持作为 CASE 语句的同一关键字。但是使用不同的语法和语义计算指定的 conditions 。CASE 表达式会返回一个值或 NULL,如 CASE 表达式 中描述。)
CASE 语句的此实现非常类似于GBase 8s Parallel Server 的实现,除了当未指定 ELSE 子句且没有 WHEN 子句与 value_expr 参数相匹配时,GBase 8s Parallel Server 不会发生错误。在这种情况下,程序执行将在紧跟 CASE 语句之后的 SPL 或 SQL 语句中继续。
更随 THEN 或 ELSE 关键字的语句块可以包括在 SPL 例程的语句块中有效的任何 SQL 语句或 SPL 语句。有关更多信息,请参阅语句块。
数据库服务器仅计算一次 value_expr 参数的值。它在开始执行 CASE 语句时计算此值。如果该参数中的指定表达式包含一个或多个 SPL 变量。并且这些变量中的任何变量的值随后在 CASE 语句中的一个语句块中修改,则数据库服务器不会重新计算 value_expr 参数的值。因此,在 value_expr 参数中指定的变量值的任何更改都不好影响 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;