PL/SQL Challenge 每日一题:2015-6-10 在条件比较中使用NULL

[复制链接]
查看11 | 回复1 | 2008-9-15 01:28:12 | 显示全部楼层 |阅读模式
(原发表于2010-11-22)

最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。
以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808
原始出处:
http://www.plsqlchallenge.com/
作者:Steven Feuerstein
运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品
我成功地编译了下列过程(换言之,所有在handle_illness中引用到的过程都是有效的,调用也是正确的):
CREATE OR REPLACE PROCEDURE handle_illness (
sneezes_per_hour_in IN PLS_INTEGER)
IS
BEGIN
IF NOT (sneezes_per_hour_in < 50)
THEN
call_doctor ();
sneeze_wetly_into_phone ();
make_appointment ();
ELSE
sorry_you_are_not_that_sick ();
END IF;
END;
/
哪些说法正确描述了我执行下列代码块之后的情形:
BEGIN
handle_illness (NULL);
END;
/
(A)
所有引用到的过程都不会被执行,因为ORACLE在IF语句中一旦碰到NULL值就会抛出VALUE_ERROR。
(B)
sorry_you_are_not_that_sick 过程会被执行。
(C)
NULL 并不会小于50, 因此 "NOT (sneezes_per_hour_in < 50)" 表达式的值为TRUE, 因此过程 call_doctor, sneeze_wetly_into_phone 和 make_appointment 都会被执行。

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案B, 2楼得奖。
A: 在条件语句中的NULL值并不会导致VALUE_ERROR异常。
B,C: NULL和50的比较结果是NULL, 加上NOT之后也仍然是NULL, 所以IF条件不成立,ELSE分支将被执行。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则