Oracle教程:CASE语句与CASE表达式

Linux大全评论1.1K views阅读模式

case语句与case表达式是plsql流程控制的重要组成部分,尽管其使用方法较为简单,但容易混淆。本文将描述case语句与case表达式并给出演示以便于更好理解两者的异同及使用时的注意事项。

一、简单case语句

  1. -->语法   
  2.   
  3. CASE SELECTOR  
  4. WHEN EXPRESSION 1 THEN STATEMENT 1;  
  5. WHEN EXPRESSION 2 THEN STATEMENT 2;  
  6. ...  
  7. WHEN EXPRESSION N THEN STATEMENT N;  
  8. ELSE STATEMENT N+1;  
  9. END CASE;  
  10.   
  11. --简单的case语句是指SELECTOR中得到的值或结果与EXPRESSION n中的值或结果相匹配,一旦找到匹配,则对应的语句被执行。直到找到为止。   
  12. --如果对应的EXPRESSION n 中没有匹配,则此时ELSE上阵,执行其后对应的语句。   
  13. --ELSE为可选项。如省略且when条件中未找到任何匹配项,则收到case_not_found异常。   
  14.   
  15. -->演示简单case语句   
  16. sys@ORCL> DECLARE  
  17.   2     v_num    NUMBER := &in_num;  
  18.   3     v_flag   NUMBER;  
  19.   4  BEGIN  
  20.   5     v_flag := MOD (v_num, 2);  
  21.   6    
  22.   7     CASE v_flag  
  23.   8        WHEN 0  
  24.   9        THEN  
  25.  10           DBMS_OUTPUT.put_line (v_num || ' is even number');  
  26.  11        WHEN 1  
  27.  12        THEN  
  28.  13           DBMS_OUTPUT.put_line (v_num || ' is odd number');  
  29.  14        ELSE  
  30.  15           NULL;  
  31.  16     END CASE;  
  32.  17  END;  
  33.  18  /  
  34. Enter value for in_num: 5  
  35. is odd number  
  36.   
  37. PL/SQL procedure successfully completed.  

二、搜索式case语句

  1. -->语法   
  2.   
  3. CASE  
  4. WHEN SEARCH CONDITION 1 THEN STATEMENT 1;  
  5. WHEN SEARCH CONDITION 2 THEN STATEMENT 2;  
  6. ...  
  7. WHEN SEARCH CONDITION N THEN STATEMENT N;  
  8. ELSE STATEMENT N+1;  
  9. END CASE;  
  10.   
  11. --搜索式case语句与简单case语句长相不一样。首先是case 之后没有接selector,其次是when之后的SEARCH CONDITION n得到的结果为布尔型,   
  12. --当搜索到第一个为TRUE的STATEMENT的结果会被返回。若果所有的when之后的SEARCH CONDITION没有为TRUE的,则else之后的STATEMENT   
  13. --的结果会被返回。如果此时省略了else子句,等同于简单case语句,同样会收到case_not_found异常。谁叫他俩一母同胞呢?   
  14.   
  15. -->下面演示搜索式case   
  16. scott@ORCL> DECLARE  
  17.   2     v_num   NUMBER := &in_num;  
  18.   3  BEGIN  
  19.   4     CASE  
  20.   5        WHEN v_num > 0  
  21.   6        THEN  
  22.   7           DBMS_OUTPUT.put_line (v_num || ' is a positive number ');  
  23.   8        WHEN v_num < 0  
  24.   9        THEN  
  25.  10           DBMS_OUTPUT.put_line (v_num || ' is a negative number ');  
  26.  11        ELSE  
  27.  12           DBMS_OUTPUT.put_line (v_num || ' is zero ');  
  28.  13     END CASE;  
  29.  14  END;  
  30.  15  /  
  31. Enter value for in_num: -3  
  32. -3 is a negative number  
  33.   
  34. -->如下例所示所有的when之后的没有一个为true,且省略了else子句,那么迎接你的是CASE not found   
  35. scott@ORCL> DECLARE  
  36.   2     v_num   NUMBER := &in_num;  
  37.   3  BEGIN  
  38.   4     CASE  
  39.   5        WHEN v_num > 0  
  40.   6        THEN  
  41.   7           DBMS_OUTPUT.put_line (v_num || ' is a positive number ');  
  42.   8        WHEN v_num < 0  
  43.   9        THEN  
  44.  10           DBMS_OUTPUT.put_line (v_num || ' is a negative number ');  
  45.  11     END CASE;  
  46.  12  END;  
  47.  13  /  
  48. Enter value for in_num: 0  
  49. DECLARE  
  50. *  
  51. ERROR at line 1:  
  52. ORA-06592: CASE not found while executing CASE statement  
  53. ORA-06512: at line 4  

企鹅博客
  • 本文由 发表于 2020年7月6日 20:13:04
  • 转载请务必保留本文链接:https://www.qieseo.com/184430.html

发表评论