扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:builder.com.cn 2007年5月8日
关键字: SQL PL/SQL SQL Server
PL/SQL中提供了丰富的CASE功能。我们可以使用选择CASE语句来检测一个表达式的值(更像DECODE函数所完成的功能一样),并对第一个匹配的值来执行一条或多条语句。使用查找CASE语句可以检测多个表达式并根据第一个检测到为真的表达式执行一条或多条语句。
与其它语言不同,如果没有任何case相匹配,PL/SQL 中的CASE语句并不是简单的“泡影”,相反,默认的是抛出一个ORA-06592异常,“当执行CASE语句时,没有发现CASE”。
当一次发生时,可能会令你感到惊奇,尤其是如果你已习惯使用其它不会做出同样反应的语言时。在项目进行了几个月后,当异常的数据集触发此类错误时,经常会发生此类漏洞。
列表A是一个简单的例子。(该例中使用了查找CASE语句,但是两种类型的CASE语句的行为是一样的)。赋给变量p的初值为0,然后进行测试,因为没有任何表达式为真,所以发生了ORA-06592异常。
解决这个问题有三种方法,其中前两种是很明显的,第三种则不是很明显。
第一种明显的解决方法是确保你的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语句所在语句块外部的任何地方,并且可以在对应级别捕获该异常。这意味着当异常发生时,你可以轻松处理多个级别的异常。
“防弹”代码可以预测可能的错误值并对这些值提前做好相应处理准备。
责任编辑:德东
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者