我有一个包含空元素的PL / SQL集合(在最小的工作示例中它只是那个,但行为与其他元素相同)。当我现在查询此集合是否具有特定数字作为元素时,它会按预期返回false
。但问题是,否定查询也会产生false
的答案。
任何人都可以确认这种行为或指导我在这里失败的假设吗?
DECLARE
TYPE number_t IS TABLE OF NUMBER;
nt1 number_t := number_t();
BEGIN
nt1.extend();
dbms_output.put_line('Start'); -- prints 'Start'
IF 1 member of nt1 THEN
dbms_output.put_line('Member'); -- does not execute
END IF;
IF not 1 member of nt1 THEN
dbms_output.put_line('Not member'); -- does not execute
END IF;
IF not (1 member of nt1) THEN
dbms_output.put_line('Not member'); -- does not execute
END IF;
END;
观察:Oracle数据库11g企业版11.2.0.4.0版 - 64位
尚未在其他装置上测试过。
答案 0 :(得分:5)
根据Oracle文档,“EXTEND
将一个空元素附加到集合”并且{MEMBER
运算符的返回值]为TRUE
expr
等于指定嵌套表“
将任何值与null进行比较都会产生UNKNOWN
结果,因此条件既不是TRUE
也不是FALSE
,因此永远不会执行THEN
块。
参考文献:
答案 1 :(得分:2)
为了完整起见,我检查not MEMBER
时考虑可能的NULL
值的最终方式是:
IF not 1 member of nt1 OR (1 member of nt1) IS NULL THEN
dbms_output.put_line('NULL'); -- prints 'NULL'
END IF;