Welcome 微信登录

首页 / 数据库 / MySQL / Oracle教程:CASE语句与CASE表达式

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  
  • 1
  • 2
  • 下一页
Oracle Jdeveloper 上传XML文件到动态数据表中CGI如何用C控制SQLite3?相关资讯      oracle数据库教程 
  • Oracle raw数据类型介绍  (01/29/2013 10:05:53)
  • 监听器注册与ORA-12514 错误分析  (11/13/2012 14:30:08)
  • Oracle SQL的cursor理解  (11/13/2012 14:16:17)
  • Oracle 如何强制刷新Buffer Cache  (01/29/2013 10:02:46)
  • dblink致Oracle库的SCN变成两库的  (11/13/2012 14:24:41)
  • Linux操作系统下完全删除Oracle数  (11/13/2012 08:25:52)
本文评论 查看全部评论 (0)
表情: 姓名: 字数