避免PL/SQL Case Not Found错误三方法

避免PL/SQL Case Not Found错误三方法
数据库 2010-02-21 17:34:48 阅读75 评论0 字号:大中小 订阅

PL/SQL中提供了丰富的CASE功能。我们可以使用选择CASE语句来检测一个表达式的值(更像DECODE函数所完成的功能一样),并对第一个匹配的值来执行一条或多条语句。使用查找CASE语句可以检测多个表达式并根据第一个检测到为真的表达式执行一条或多条语句。

与其它语言不同,如果没有任何case相匹配,PL/SQL 中的CASE语句并不是简单的“泡影”,相反,默认的是抛出一个ORA-06592异常,“当执行CASE语句时,没有发现CASE”。

当一次发生时,可能会令你感到惊奇,尤其是如果你已习惯使用其它不会做出同样反应的语言时。在项目进行了几个月后,当异常的数据集触发此类错误时,经常会发生此类漏洞。

下面是一个简单的例子。(该例中使用了查找CASE语句,但是两种类型的CASE语句的行为是一样的)。赋给变量p的初值为0,然后进行测试,因为没有任何表达式为真,所以发生了ORA-06592异常。
SET SERVEROUT ON
DECLARE
p BINARY_INTEGER:= 0;
q BINARY_INTEGER := 0;
BEGIN
CASE
WHEN p>100 THEN q:= 1;
WHEN p>50 THEN q:= 2;
WHEN p>10 THEN q:= 3;
END CASE;
DBMS_OUTPUT.PUT_LINE('q = ' || q);
END;
/

解决这个问题有三种方法,其中前两种是很明显的,第三种则不是很明显。

第一种明显的解决方法是确保你的WHEN cases语句包括所有可能的值。这听起来很简单,但实际并非如此。例如,如果你有三种情况来包括数值型的域:小于0,等于0和大于0。

这看起来包括了所有可能的值,但是当某个人在表中插入一行该域为空(NULL)的值时,将会怎样?NULL没有包含在上述三种情况之中,那么就会导致Case Not Found的错误。

第二种明显的解决方法是在CASE语句中始终包含ELSE字句。如果没有一个指定的条件为真,那么将会执行ELSE子句,这时就不会产生ORA-06592异常。如果你不包含一个ELSE子句,那么将会产生一个CASE_NOT_FOUND异常使你跳出该语句块。

第三种不明显的方法是用一个语句块将CASE结构包含在其中,并使用该语句块的EXCEPTION部分进行异常处理。列表B演示了使用该方法的一个例子。

这种方法与使用ELSE子句有一点区别:虽然都可以包含多条语句,但是该方法可以将CASE_NOT_FOUND异常处理放在CASE语句所在语句块外部的任何地方,并且可以在对应级别捕获该异常。这意味着当异常发生时,你可以轻松处理多个级别的异常。

“防弹”代码可以预测可能的错误值并对这些值提前做好相应处理准备。

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/350519/viewspace-1042144/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/350519/viewspace-1042144/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值