Oracle教程:CASE语句与CASE表达式
Oracle教程:CASE语句与CASE表达式
case语句与case表达式是plsql流程控制的重要组成部分,尽管其使用方法较为简单,但容易混淆。本文将描述case语句与case表达式并给出演示以便于更好理解两者的异同及使用时的注意事项。一、简单case语句
- -->语法
- CASE SELECTOR
- WHEN EXPRESSION 1 THEN STATEMENT 1;
- WHEN EXPRESSION 2 THEN STATEMENT 2;
- ...
- WHEN EXPRESSION N THEN STATEMENT N;
- ELSE STATEMENT N+1;
- END CASE;
- --简单的case语句是指SELECTOR中得到的值或结果与EXPRESSION n中的值或结果相匹配,一旦找到匹配,则对应的语句被执行。直到找到为止。
- --如果对应的EXPRESSION n 中没有匹配,则此时ELSE上阵,执行其后对应的语句。
- --ELSE为可选项。如省略且when条件中未找到任何匹配项,则收到case_not_found异常。
- -->演示简单case语句
- sys@ORCL> DECLARE
- 2 v_num NUMBER := &in_num;
- 3 v_flag NUMBER;
- 4 BEGIN
- 5 v_flag := MOD (v_num, 2);
- 6
- 7 CASE v_flag
- 8 WHEN 0
- 9 THEN
- 10 DBMS_OUTPUT.put_line (v_num || ' is even number');
- 11 WHEN 1
- 12 THEN
- 13 DBMS_OUTPUT.put_line (v_num || ' is odd number');
- 14 ELSE
- 15 NULL;
- 16 END CASE;
- 17 END;
- 18 /
- Enter value for in_num: 5
- 5 is odd number
- PL/SQL procedure successfully completed.
- -->语法
- CASE
- WHEN SEARCH CONDITION 1 THEN STATEMENT 1;
- WHEN SEARCH CONDITION 2 THEN STATEMENT 2;
- ...
- WHEN SEARCH CONDITION N THEN STATEMENT N;
- ELSE STATEMENT N+1;
- END CASE;
- --搜索式case语句与简单case语句长相不一样。首先是case 之后没有接selector,其次是when之后的SEARCH CONDITION n得到的结果为布尔型,
- --当搜索到第一个为TRUE的STATEMENT的结果会被返回。若果所有的when之后的SEARCH CONDITION没有为TRUE的,则else之后的STATEMENT
- --的结果会被返回。如果此时省略了else子句,等同于简单case语句,同样会收到case_not_found异常。谁叫他俩一母同胞呢?
- -->下面演示搜索式case
- scott@ORCL> DECLARE
- 2 v_num NUMBER := &in_num;
- 3 BEGIN
- 4 CASE
- 5 WHEN v_num > 0
- 6 THEN
- 7 DBMS_OUTPUT.put_line (v_num || ' is a positive number ');
- 8 WHEN v_num < 0
- 9 THEN
- 10 DBMS_OUTPUT.put_line (v_num || ' is a negative number ');
- 11 ELSE
- 12 DBMS_OUTPUT.put_line (v_num || ' is zero ');
- 13 END CASE;
- 14 END;
- 15 /
- Enter value for in_num: -3
- -3 is a negative number
- -->如下例所示所有的when之后的没有一个为true,且省略了else子句,那么迎接你的是CASE not found
- scott@ORCL> DECLARE
- 2 v_num NUMBER := &in_num;
- 3 BEGIN
- 4 CASE
- 5 WHEN v_num > 0
- 6 THEN
- 7 DBMS_OUTPUT.put_line (v_num || ' is a positive number ');
- 8 WHEN v_num < 0
- 9 THEN
- 10 DBMS_OUTPUT.put_line (v_num || ' is a negative number ');
- 11 END CASE;
- 12 END;
- 13 /
- Enter value for in_num: 0
- DECLARE
- *
- ERROR at line 1:
- ORA-06592: CASE not found while executing CASE statement
- ORA-06512: at line 4
|
评论暂时关闭