KingbaseES PL/SQL 过程语言参考手册(3.7. 表达式、3.8. 错误报告函数)

3.7. 表达式

表达式是一个或多个值、运算符和SQL函数的组合,其计算结果为一个值。

一个表达式始终返回唯一值。按照复杂性的增加顺序,最简单的表达式是:

  • 单个常量或变量(例如,a)

  • 一元操作符和单个操作数(例如,-a)

  • 二元操作符和2个操作数(例如,a+b)

操作数可以是变量、常量、常数、运算符、函数调用、占位符或其他表达式。因此,表达式可以任意复杂。

操作数的数据类型决定表达式的数据类型。每次计算表达式时,都会生成该数据类型的单个值。该结果的数据类型就是表达式的数据类型。

3.7.1. 连接运算符

连接运算符(| |)将一个字符串操作数附加到另一个字符串操作数。 连接运算符忽略NULL操作数。

示例 3-26连接运算符

\set SQLTERM /
DECLARE
   a text := 'hello';
   b text := ' world';
BEGIN
   raise notice '%', a || b;
END;
/

结果:

NOTICE:  hello world

示例 3-27带NULL操作数的连接运算符

如本例所示,连接运算符忽略NULL操作数。

\set SQLTERM /
BEGIN
   RAISE NOTICE '%', 'hello' || NULL || NULL || ' world';
END;
/

结果:

NOTICE:  hello world

3.7.2. 运算符优先级

运算是一元运算符操作及单个操作数或二元运算符及其两个操作数。表达式中的操作按照运算符的优先级的顺序计算。

下表显示了从最高到最低的运算符优先级。优先级相等的运算符不会按特定顺序求值。

表 3.7.1 运算符优先级

运算符

含义

^

指数运算符

+,-

正、负

*,/

乘、除

+,-,

加、减、连接符

=,<,>,<=,>=,<>,!=,^=,IS NULL,LIKE,BETWEEN,IN

比较运算符

NOT

AND

OR

要控制计算顺序,请将操作括在括号中。

嵌套括号时,首先计算嵌套最深的操作。

如果括号不影响计算顺序,还可以使用括号来提高可读性。

示例 3-28用括号控制求值顺序

在本例中,首先计算运算(2+3)和(4+5),分别产生值5和9。接下来,计算操作5×9,产生结果45。最后,对操作45/9进行计算,得出最终值5。

\set SQLTERM /
DECLARE
   x int := ((2+3)*(4+5))/9;
BEGIN
   raise notice 'x = %',x;
END;
/

结果:

NOTICE:  x = 5

示例 3-29使用括号提高可读性

在本例中,括号不影响求值顺序。它们只会提高可读性。

\set SQLTERM /
DECLARE
   x int := 1^2*2^2;
   y int := (1^2)*(2^2);
BEGIN
   raise notice 'x = %',x;
   raise notice 'y = %',y;
END;
/

结果:

NOTICE:  x = 4
NOTICE:  y = 4

示例 3-30运算符优先级

本例显示了运算符优先级和括号在几个更复杂的表达式中的效果。

\set SQLTERM /
DECLARE
   score NUMBER := 100;
   additional_score NUMBER := 20;
BEGIN
   -- Division has higher precedence than addition:
   RAISE NOTICE '3 + 10 / 2 = %', 3 + 10 / 2;
   RAISE NOTICE '10 / 2 + 3 = %', 10 / 2 + 3;
   -- Parentheses override default operator precedence:
   RAISE NOTICE '6 + 9 / 3 = %', 6 + 9 / 3;
   RAISE NOTICE '(6 + 9) / 3 = %', (6 + 9) / 3;
   -- Most deeply nested operation is evaluated first:
   RAISE NOTICE '80 + (10 / 2 + (6 - 2)) = %', 80 + (10 / 2 + (6 - 2));
   -- Parentheses, even when unnecessary, improve readability:
   RAISE NOTICE '(score * 0.5) + (additional_score * 0.2) = %',
   (score * 0.5) + (additional_score * 0.2);
   RAISE NOTICE 'score * 0.5 + additional_score * 0.2 = %',
   score * 0.5 + additional_score * 0.2;
END;
/

结果:

NOTICE:  3 + 10 / 2 = 8
NOTICE:  10 / 2 + 3 = 8
NOTICE:  6 + 9 / 3 = 9
NOTICE:  (6 + 9) / 3 = 5
NOTICE:  80 + (10 / 2 + (6 - 2)) = 89
NOTICE:  (score * 0.5) + (additional_score * 0.2) = 54.0
NOTICE:  score * 0.5 + additional_score * 0.2 = 54.0

3.7.3. 逻辑运算符

逻辑运算符AND、OR和NOT遵循下表所示的三态逻辑。AND和OR是二元运算符;NOT是一元运算符。

表 3.7.2 逻辑真值表

x

y

xANDy

xORy

NOTx

TRUE

FALSE

FALSE

TRUE

FALSE

TRUE

TRUE

TRUE

TRUE

FALSE

TRUE

NULL

NULL

TRUE

FALSE

FALSE

TRUE

FALSE

TRUE

TRUE

FALSE

FALSE

FALSE

FALSE

TRUE

FALSE

NULL

FALSE

NULL

TRUE

NULL

TRUE

NULL

TRUE

NULL

NULL

FALSE

FALSE

NULL

NULL

NULL

NULL

NULL

NULL

NULL

当且仅当两个操作数为TURE,AND返回TURE;当有一个为TURE,OR返回TURE;NOT返回操作数的相反值,除非操作数是NULL。NOT NULL还是NULL。因为NULL本身就是一个不确定的值。

示例 3-31打印布尔变量的过程程序

这个例子创建一个show_boolean程序,它输出一个 BOOLEAN 变量的值。该过程使用“IS [NOT] NULL 运算符”。本章中的几个示例调用show_boolean。

\set SQLTERM /
CREATE OR REPLACE PROCEDURE show_boolean (
name VARCHAR2,
value BOOLEAN
) AUTHID DEFINER IS
BEGIN
   IF value IS NULL THEN
      RAISE NOTICE '% = NULL',name;
   ELSIF value = TRUE THEN
      RAISE NOTICE '% = TRUE',name;
   ELSE
      RAISE NOTICE '% = FALSE',name;
   END IF;
END;
/

示例 3-32 AND运算符

如本例所示,当且仅当两个操作数均为TRUE时,AND返回TRUE。

\set SQLTERM /
DECLARE
PROCEDURE show_x_and_y (
x BOOLEAN,
y BOOLEAN
) IS
BEGIN
   show_boolean ('x', x);
   show_boolean ('y', y);
   show_boolean ('x AND y', x AND y);
END show_x_and_y;
BEGIN
   show_x_and_y (FALSE, FALSE);
   show_x_and_y (TRUE, FALSE);
   show_x_and_y (FALSE, TRUE);
   show_x_and_y (TRUE, TRUE);
   show_x_and_y (TRUE, NULL);
   show_x_and_y (FALSE, NULL);
   show_x_and_y (NULL, TRUE);
   show_x_and_y (NULL, FALSE);
END;
/

结果:

NOTICE:  x = FALSE
NOTICE:  y = FALSE
NOTICE:  x AND y = FALSE
NOTICE:  x = TRUE
NOTICE:  y = FALSE
NOTICE:  x AND y = FALSE
NOTICE:  x = FALSE
NOTICE:  y = TRUE
NOTICE:  x AND y = FALSE
NOTICE:  x = TRUE
NOTICE:  y = TRUE
NOTICE:  x AND y = TRUE
NOTICE:  x = TRUE
NOTICE:  y = NULL
NOTICE:  x AND y = NULL
NOTICE:  x = FALSE
NOTICE:  y = NULL
NOTICE:  x AND y = FALSE
NOTICE:  x = NULL
NOTICE:  y = TRUE
NOTICE:  x AND y = NULL
NOTICE:  x = NULL
NOTICE:  y = FALSE
NOTICE:  x AND y = FALSE

示例 3-33 OR运算符

如本例所示,如果其中一个操作数为TRUE,OR返回TRUE。

\set SQLTERM /
DECLARE
PROCEDURE show_x_or_y (
x BOOLEAN,
y BOOLEAN
) IS
BEGIN
   show_boolean ('x', x);
   show_boolean ('y', y);
   show_boolean ('x OR y', x OR y);
END show_x_or_y;
BEGIN
   show_x_or_y (FALSE, FALSE);
   show_x_or_y (TRUE, FALSE);
   show_x_or_y (FALSE, TRUE);
   show_x_or_y (TRUE, TRUE);
   show_x_or_y (TRUE, NULL);
   show_x_or_y (FALSE, NULL);
   show_x_or_y (NULL, TRUE);
   show_x_or_y (NULL, FALSE);
END;
/

结果:

NOTICE:  x = FALSE
NOTICE:  y = FALSE
NOTICE:  x OR y = FALSE
NOTICE:  x = TRUE
NOTICE:  y = FALSE
NOTICE:  x OR y = TRUE
NOTICE:  x = FALSE
NOTICE:  y = TRUE
NOTICE:  x OR y = TRUE
NOTICE:  x = TRUE
NOTICE:  y = TRUE
NOTICE:  x OR y = TRUE
NOTICE:  x = TRUE
NOTICE:  y = NULL
NOTICE:  x OR y = TRUE
NOTICE:  x = FALSE
NOTICE:  y = NULL
NOTICE:  x OR y = NULL
NOTICE:  x = NULL
NOTICE:  y = TRUE
NOTICE:  x OR y = TRUE
NOTICE:  x = NULL
NOTICE:  y = FALSE
NOTICE:  x OR y = NULL

示例 3-34 NOT运算符

如本例所示,NOT返回与其操作数相反的值,除非操作数为NULL。NOT NULL返回NULL,因为NULL是一个不确定的值。

\set SQLTERM /
DECLARE
PROCEDURE show_not_x (
x BOOLEAN
) IS
BEGIN
   show_boolean ('x', x);
   show_boolean ('NOT x', NOT x);
END show_not_x;
BEGIN
   show_not_x (TRUE);
   show_not_x (FALSE);
   show_not_x (NULL);
END;
/

结果:

NOTICE:  x = TRUE
NOTICE:  NOT x = FALSE
NOTICE:  x = FALSE
NOTICE:  NOT x = TRUE
NOTICE:  x = NULL
NOTICE:  NOT x = NULL

示例 3-35不相等比较中的NULL值

在本例中,您可能期望语句序列运行,因为x和y看起来不相等。但是,NULL值是不确定的,x是否等于y是未知的。因此, IF条件会产生NULL,并且会绕过语句序列。

\set SQLTERM /
DECLARE
x NUMBER := 5;
y NUMBER := NULL;
BEGIN
   IF x != y THEN -- yields NULL, not TRUE
      RAISE NOTICE 'x != y';
   ELSIF x = y THEN -- also yields NULL
      RAISE NOTICE 'x = y';
   ELSE
      RAISE NOTICE 'Can''t tell if x and y are equal or not.';
   END IF;
END;
/

结果:

NOTICE:  Can't tell if x and y are equal or not.

示例 3-36 相等比较中的NULL值

在本例中,a和b看起来是相等的。但是,同样的,也未知的,所以 IF条件产生了NULL,并且语句序列就被绕过去了。

\set SQLTERM /
DECLARE
   a NUMBER := NULL;
   b NUMBER := NULL;
BEGIN
   IF a = b THEN -- yields NULL, not TRUE
      RAISE NOTICE 'a = b'; -- not run
   ELSIF a != b THEN -- yields NULL, not TRUE
      RAISE NOTICE 'a != b'; -- not run
   ELSE
      RAISE NOTICE 'Can''t tell if two NULLs are equal';
   END IF;
END;
/

结果:

NOTICE:  Can't tell if two NULLs are equal

示例 3-37 NOT NULL等于NULL

在本例中,两个IF语句似乎是等价的。但是,如果a或b有一个是NULL,那么第一个IF语句将b的值赋值给high,而第二个if语句将a的值赋值为high。

\set SQLTERM /
DECLARE
   a INTEGER := 2;
   b INTEGER := 5;
   high INTEGER;
BEGIN
   IF (a > b) THEN
      high := a;
   ELSE
      high := b;
   END IF;
   RAISE NOTICE 'high = %',high;

   IF NOT (a > b) THEN
      high := b;
   ELSE
      high := a;
   END IF;
   RAISE NOTICE 'high = %',high;
END;
/

结果

NOTICE:  high = 5
NOTICE:  high = 5

示例 3-38更改逻辑运算符的求值顺序

本例三次调用show_boolean过程。第三次调用和第一次调用在逻辑上是等价的。第三次调用中的括号只会提高可读性。第二次调用中的括号改变了操作顺序。

\set SQLTERM /
DECLARE
   a BOOLEAN := FALSE;
   b BOOLEAN := FALSE;
BEGIN
   show_boolean ('NOT a AND b', NOT a AND b);
   show_boolean ('NOT (x AND y)', NOT (a AND b));
   show_boolean ('(NOT x) AND y', (NOT a) AND b);
END;
/

结果:

NOTICE:  NOT a AND b = FALSE
NOTICE:  NOT (x AND y) = TRUE
NOTICE:  (NOT x) AND y = FALSE

3.7.4. 短路计算

当计算一个逻辑表达式的时候,PL/SQL使用短路计算。一旦能够确认表达式的值,则就不进行后续计算了。 因此,您可以编写可能会导致错误的表达式。

示例 3-39 短路计算

在本例中,短路计算可防止OR表达式导致除零错误。当num1的值为零时,左操作数的值为真,因此PL/SQL不会计算右操作数。如果PL/SQL在应用OR运算符之前对两个操作数进行了求值,则正确的操作数将导致除零错误。

\set SQLTERM /
DECLARE
   num1 INTEGER := 0;
   num2 INTEGER := 100;
BEGIN
   IF (num1 = 0) OR ((num2 / num1) < 5) THEN
      RAISE NOTICE 'On hand quantity is zero.';
   END IF;
END;
/

结果:

NOTICE:  On hand quantity is zero.

3.7.5. 比较运算符

比较运算符将一个表达式与另一个表达式进行比较。结果总是TRUE、FALSE或NULL。 如果一个表达式的值为NULL,则比较结果也为NULL。 比较运算符包括:

  • IS [NOT] NULL运算符

  • 关系运算符

  • LIKE运算符

  • BETWEEN运算符

  • IN运算符

3.7.5.1. IS [NOT] NULL运算符

IS NULL运算符如果其操作数为NULL,则返回布尔值TRUE;如果不为NULL,则返回FALSE。IS NOT NULL运算符的作用正好相反。

涉及NLL值的比较总是产生NULL值。

要测试值是否为NULL,请使用IF value IS NULL形式做判断。

3.7.5.2. 关系运算符

下表总结了关系运算符。

运算符

含义

=

等于

<>,!=,^=

不等于

<

小于

>

大于

<=

小于等于

>=

大于等于

3.7.5.3. 关系运算符

如果一个数字代表更大的数量,那么它就比另一个数字大。

真实数字被存储为近似值,所以建议比较它们是否相等或不相等。

示例 3-40表达式中的关系运算符

本例调用show_boolean过程来打印使用关系运算符比较算术值的表达式的值。

\set SQLTERM /
BEGIN
   show_boolean ('(1 + 1 = 2)', 1 + 1 = 2);
   show_boolean ('(1 + 1 <> 2)', 1 + 1 <> 2);
   show_boolean ('(1 + 1 != 2)', 1 + 1 != 2);
   show_boolean ('(1 + 1 ^= 2)', 1 + 1 ^= 2);
   show_boolean ('(2 < 4)', 2 < 4);
   show_boolean ('(2 > 4)', 2 > 4);
   show_boolean ('(2 <= 4)', 2 <= 4);
   show_boolean ('(2 >= 2)', 2 >= 2);
END;
/

结果:

NOTICE:  (1 + 1 = 2) = TRUE
NOTICE:  (1 + 1 <> 2) = FALSE
NOTICE:  (1 + 1 != 2) = FALSE
NOTICE:  (1 + 1 ^= 2) = FALSE
NOTICE:  (2 < 4) = TRUE
NOTICE:  (2 > 4) = FALSE
NOTICE:  (2 <= 4) = TRUE
NOTICE:  (2 >= 2) = TRUE

3.7.5.3.1. 布尔比较

根据定义,TRUE大于FALSE。任何与NULL的比较都返回NULL。

3.7.5.3.2. 字符比较

默认情况下,如果二进制值较大,则一个字符大于另一个字符。

例如,这个比较是成立的:

'y' > 'r'

字符串需要逐个字符进行比较。例如,以下比较是成立的:

'Kathy' > 'Kathryn'

排序序列是字符集的内部顺序,其中一系列数字代码表示单个字符。如果一个字符的内部数值较大,则该字符的值大于另一个字符的值。每种语言可能都有不同的规则来确定这些字符在排序序列中的位置。

3.7.5.3.3. 时间比较

如果一个日期比另一个日期晚,那么这个日期比另一个日期大。

例如,以下表达式成立:

'01-JAN-91' > '31-DEC-90'

3.7.5.4. LIKE运算符

LIKE运算符将字符、字符串或CLOB值与模式进行比较,如果值与模式匹配,则返回TRUE,如果不匹配,则返回FALSE。

大小写是有意义的。

该模式可以包括两个通配符下划线(_)和百分号(%)。

下划线匹配一个字符。

百分号(%)匹配0个或更多字符。

要搜索百分号或下划线,请定义转义字符并将其置于百分号或下划线之前。

示例 3-41表达式中的LIKE运算符

字符串“Student”与模式“S%u__n”匹配,但与“S%U_N”不匹配,如本例所示。

\set SQLTERM /
DECLARE
   PROCEDURE string_match (
   value VARCHAR2,
   pattern VARCHAR2
   ) IS
   BEGIN
      IF value LIKE pattern THEN
         RAISE NOTICE 'TRUE';
      ELSE
         RAISE NOTICE 'FALSE';
      END IF;
   END;
BEGIN
   string_match('Stduent', 'S%u__t');
   string_match('Stduent', 'S%U__N');
END;
/

结果:

NOTICE:  TRUE
NOTICE:  FALSE

示例 3-42 模式中的转义字符

本例使用反斜杠作为转义字符,因此字符串中的百分号不会用作通配符。

\set SQLTERM /
DECLARE
   PROCEDURE escape_character (str VARCHAR2) IS
   BEGIN
      IF str LIKE 'test1\%test2!' ESCAPE '\' THEN
         RAISE NOTICE 'TRUE';
      ELSE
         RAISE NOTICE 'FALSE';
      END IF;
   END;
BEGIN
   escape_character('test1%test2!');
END;
/

结果:

NOTICE:  TRUE

3.7.5.5. BETWEEN运算符

BETWEEN运算符测试值是否在指定范围内。 a和b之间的表达式x的值被定义为与表达式(x>=a)和(x<=b)的值相同。表达式x将只计算一次。

示例 3-43 表达式中的BETWEEN运算符

本例调用show_boolean过程来打印包含BETWEEN运算符的表达式的值。

\set SQLTERM /
BEGIN
   show_boolean ('4 BETWEEN 3 AND 5', 4 BETWEEN 3 AND 5);
   show_boolean ('3 BETWEEN 3 AND 4', 3 BETWEEN 3 AND 4);
   show_boolean ('5 BETWEEN 3 AND 4', 5 BETWEEN 3 AND 4);
   show_boolean ('4 BETWEEN 4 AND 5', 4 BETWEEN 4 AND 5);
END;
/

结果:

NOTICE:  4 BETWEEN 3 AND 5 = TRUE
NOTICE:  3 BETWEEN 3 AND 4 = TRUE
NOTICE:  5 BETWEEN 3 AND 4 = FALSE
NOTICE:  4 BETWEEN 4 AND 5 = TRUE

3.7.5.6. IN运算符

IN运算符测试集合成员资格。

只有当x等于集合的一个成员时,x IN (set)才返回TRUE。

示例 3-44表达式中的IN运算符

本例调用show_boolean过程来打印包含IN运算符的表达式的值。

\set SQLTERM /
DECLARE
   chr VARCHAR2(1) := 'q';
BEGIN
   show_boolean (
   'chr IN (''i'', ''j'', ''k'')',
   chr IN ('i', 'j', 'k')
   );
   show_boolean (
   'chr IN (''o'', ''p'', ''q'')',
   chr IN ('o', 'p', 'q')
   );
END;
/

结果:

NOTICE:  chr IN ('i', 'j', 'k') = FALSE
NOTICE:  chr IN ('o', 'p', 'q') = TRUE

示例 3-45 带NULL值集合的IN运算符

这个例子展示了当set包含一个NULL值时会发生什么。这将调用show_boolean过程。

\set SQLTERM /
DECLARE
a INTEGER; -- Initialized to NULL by default
b INTEGER := 5;
c INTEGER := 10;
BEGIN
   show_boolean ('5 IN (a, b, c)', 5 IN (a, b, c));
   show_boolean ('5 NOT IN (a, b, c)', 5 NOT IN (a, b, c));
   show_boolean ('10 IN (a, b)', 10 IN (a, b));
   show_boolean ('10 NOT IN (a, b)', 10 NOT IN (a, b));
   show_boolean ('a IN (a, b)', a IN (a, b));
   show_boolean ('a NOT IN (a, b)', a NOT IN (a, b));
END;
/

结果:

NOTICE:  5 IN (a, b, c) = TRUE
NOTICE:  5 NOT IN (a, b, c) = FALSE
NOTICE:  10 IN (a, b) = NULL
NOTICE:  10 NOT IN (a, b) = NULL
NOTICE:  a IN (a, b) = NULL
NOTICE:  a NOT IN (a, b) = NULL

3.7.6. 布尔表达式

布尔表达式是一个返回TURE或FLASE或NULL的表达式。一个简单的布尔表达式可以有布尔常数值、常量、变量组成。常见形式如下:

NOT boolean_expression
boolean_expression relational_operator boolean_expression
boolean_expression { AND | OR } boolean_expression

通常,在PL/SQL控制语句和DML语句的WHERE子句中使用布尔表达式作为条件。 可以使用布尔变量本身作为条件;您无需将其与值TRUE或FALSE进行比较。

示例 3-46等价的布尔表达式

在这个例子中,循环中的条件是等价的。

\set SQLTERM /
DECLARE
   stop BOOLEAN;
BEGIN
   stop := FALSE;
   WHILE stop = FALSE LOOP
      stop := TRUE;
   END LOOP;

   stop := FALSE;
   WHILE NOT (stop = TRUE) LOOP
      stop := TRUE;
   END LOOP;

   stop := FALSE;
   WHILE NOT stop LOOP
      stop := TRUE;
   END LOOP;
END;
/

3.7.7. Case表达式

一个CASE表达式从一个或多个方案中选择一个。一旦有一个条件满足,剩下的分支就不执行了。

3.7.7.1. 简单的CASE表达式

一个简单的CASE表达式具有以下语法:

CASE selector
WHEN selector_value_1 THEN result_1
WHEN selector_value_2 THEN result_2
...
WHEN selector_value_n THEN result_n
[ ELSE
else_result ]
END

selector是一个表达式(通常是一个变量)。每个selector_value和每个result可以是常数或表达式。至少一个result不能为常数NULL。

简单的CASE表达式返回selector_value与selector匹配的第一个result。其余的表达式不会被计算。如果没有selector_value与selector匹配,则CASE表达式将返回else_result(如果存在),否则返回NULL值。

示例 3-47 简单CASE表达式

这个示例将一个简单CASE表达式的值赋给变量appraisal,selector值是 grade。

\set SQLTERM /
DECLARE
   score CHAR(1) := 'A';
   comments VARCHAR2(20);
BEGIN
   comments :=
   CASE score
   WHEN 'A' THEN 'Excellent'
   WHEN 'B' THEN 'Very Good'
   WHEN 'C' THEN 'Good'
   WHEN 'D' THEN 'Fair'
   WHEN 'F' THEN 'Poor'
   ELSE 'No such score'
   END;
   RAISE NOTICE 'score = %, comments = %', score, comments;
END;
/

结果:

NOTICE:  score = A, comments = Excellent

示例 3-48 WHEN NULL条件下的简单的CASE表达式

如果selector值为NULL,则不能在WHEN NULL条件下被匹配,相反,可以在WHEN boolean_expression IS NULL条件下使用CASE表达式搜索。

\set SQLTERM /
DECLARE
   score CHAR(1); -- NULL by default
   comments VARCHAR2(20);
BEGIN
   comments :=
   CASE score
   WHEN NULL THEN 'No score assigned'
   WHEN 'A' THEN 'Excellent'
   WHEN 'B' THEN 'Very Good'
   WHEN 'C' THEN 'Good'
   WHEN 'D' THEN 'Fair'
   WHEN 'F' THEN 'Poor'
   ELSE 'No such score'
   END;
   RAISE NOTICE 'score = %, comments = %', score, comments;
END;
/

结果:

NOTICE:  score = <NULL>, comments = No such score

3.7.7.2. 搜索CASE表达式

搜索CASE表达式的语法:

CASE
WHEN boolean_expression_1 THEN result_1
WHEN boolean_expression_2 THEN result_2
...
WHEN boolean_expression_n THEN result_n
[ ELSE
else_result ]
END]

搜索CASE表达式返回第一个匹配boolean_expression为TRUE的result。剩下的表达式不再计算。如果没有boolean_expression为TRUE,则CASE表达式将返回else_result(如果存在),否则返回NULL值。

示例 3-49搜索CASE表达式

这个示例将搜索CASE表达式的值赋给变量comments。

\set SQLTERM /
DECLARE
   score CHAR(1) := 'A';
   comments VARCHAR2(120);
   id NUMBER := 20220001;
BEGIN
   comments :=
   CASE
   WHEN score = 'F' THEN 'Poor'
   WHEN score = 'A' THEN 'Excellent'
   WHEN score = 'B' THEN 'Very Good'
   WHEN score = 'C' THEN 'Good'
   WHEN score = 'D' THEN 'Fair'
   ELSE 'No such score'
   END;
   RAISE NOTICE 'Result for student % is %',id, comments;
END;
/

结果:

NOTICE:  Result for student 20220001 is Excellent

示例 3-50 WHEN ... IS NULL条件下的搜索case语句

这个示例使用一个搜索的CASE表达式来解决问题。

\set SQLTERM /
DECLARE
   score CHAR(1); -- NULL by default
   comments VARCHAR2(20);
BEGIN
   comments :=
   CASE
   WHEN score IS NULL THEN 'No score assigned'
   WHEN score = 'A' THEN 'Excellent'
   WHEN score = 'B' THEN 'Very Good'
   WHEN score = 'C' THEN 'Good'
   WHEN score = 'D' THEN 'Fair'
   WHEN score = 'F' THEN 'Poor'
   ELSE 'No such score'
   END;
   RAISE NOTICE 'score = %, comments = %', score, comments;
END;
/

结果:

NOTICE:  score = <NULL>, comments = No score assigned

3.7.8. 静态表达式

静态表达式的值可以在编译时确定,也就是说,它不包括字符比较、变量或函数调用。 静态表达式的定义:

  • 如果表达式是NULL常数值,则它是静态的。

  • 如果表达式是字符、数字或布尔常数,则它是静态的。

  • 如果表达式是对静态常数的引用,则是静态的。

  • 如果表达式是静态表达式中允许的运算符,如果其所有操作数都是静态的,并且在对这些操作数求值时,运算符未引发异常,则表达式是静态的。

运算符

运算符类别

()

表达式分隔符

*,/,+,-

算术运算符(乘、除、加、减)

=, !=, <, <=, >=, > IS [NOT] NULL

比较运算符

NOT

逻辑运算符

[NOT] LIKE, [NOT] LIKE2, [NOT] LIKE4, [NOT] LIKEC

模式匹配运算符

3.7.8.1. PLS_INTEGER静态表达式

PLS_INTEGER静态表达式是:

  • PLS_INTEGER常数

  • PLS_INTEGER静态常量

  • NULL

3.7.8.2. BOOLEAN静态表达式

BOOLEAN静态表达式是:

  • BOOLEAN常数(TRUE,FALSE或NULL)

  • BOOLEAN静态常量

  • x和y是PLS_INTEGER类型的静态表达式:

– x > y

– x < y

– x >= y

– x <= y

– x = y

– x <> y

  • x和y是BOOLEAN类型的表达式:

– NOT y

– x AND y

– x OR y

– x > y

– x >= y

– x = y

– x <= y

– x <> y

  • x是静态表达式:

– x IS NULL

– x IS NOT NULL

3.7.8.3. VARCHAR2静态表达式

VARCHAR2静态表达式是

  • 最大为32767字节的字符串常数

  • NULL

  • TO_CHAR(x),其中x是PLS_INTEGER类型静态表达式

  • x||y,其中x和y是VARCHAR2或PLS_INTEGER类型静态表达式

3.7.8.4. 静态常量

在包规范中使用以下语法声明静态常量:

constant_name CONSTANT data_type := static_expression;

其中,static_expression的类型必须与data_type相同(BOOLEAN或PLS_INTEGER)。

静态常量也必须以package_name.constant_name形式被引用,即便在package_name包体内。

3.8. 错误报告函数

PL/SQL有两个错误报告函数SQLCODE和SQLERRM,用于PL/SQL异常处理代码。

不能在SQL语句中使用SQLCODE和SQLERRM函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值