Oracle中SELECT INTO赋值NULL后NUMBER变量值及IF判断失效问题
关于Oracle中NULL值处理的两个问题解答
咱们一步一步来拆解这两个问题——其实它们本质上都是Oracle对NULL值的特殊处理逻辑导致的,这可是Oracle开发里超常见的“坑”!
问题1解答
当你用SELECT INTO把字段的NULL值读取到NUMBER变量中时,变量实际存储的就是NULL。你之所以觉得Oracle没把它识别为NULL,是因为你大概率用了=来判断NULL(比如IF(var = NULL)),这是完全错误的方式!
在SQL和PL/SQL的逻辑里,NULL不等于任何值,包括它自己。任何涉及NULL的=比较结果都是UNKNOWN,而不是TRUE,所以这种判断永远不会成立,才会让你产生“变量不是NULL”的误解。正确的判断方式是用IS NULL。
问题2解答
变量val实际存储的值是NULL,原因如下:
- 虽然你初始化
val为0,但SELECT INTO语句会把validity_table中id=123的VALIDITY字段的NULL值赋值给val,直接覆盖了初始的0。 - 你看到输出仅打印一次
Validity :(无后续值),是因为在Oracle中,字符串与NULL拼接时,结果会呈现为前缀加空内容的形式(本质是val为NULL导致拼接后的后续内容为空)。 - 程序没进入IF分支的核心原因还是错误地用
=判断NULL——IF(val = NULL)的结果永远是UNKNOWN,PL/SQL只会在条件为TRUE时执行分支代码。把判断改成IF(val IS NULL),就能正确识别NULL并进入分支了。
修正后的代码示例
DECLARE val NUMBER := 0; BEGIN SELECT VALIDITY / 24 INTO val FROM validity_table WHERE id = 123; DBMS_OUTPUT.PUT_LINE('Validity : '||val); -- 用IS NULL正确判断NULL IF(val IS NULL) THEN val := 0; DBMS_OUTPUT.PUT_LINE('Validity : '||val); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END;
内容的提问来源于stack exchange,提问作者Ashutosh
相关产品推荐
相关产品推荐

