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语句
- -->语法
-
- 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
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)