PL / SQL否定"成员"收藏不否定

时间:2015-07-16 17:24:25

标签: oracle plsql oracle11g

我有一个包含空元素的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位

尚未在其他装置上测试过。

2 个答案:

答案 0 :(得分:5)

根据Oracle文档,“EXTEND将一个空元素附加到集合”并且{MEMBER运算符的返回值]为TRUE expr等于指定嵌套表“

的成员

将任何值与null进行比较都会产生UNKNOWN结果,因此条件既不是TRUE也不是FALSE,因此永远不会执行THEN块。

参考文献:

  1. http://docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems006.htm

  2. http://docs.oracle.com/cd/B19306_01/server.102/b14200/conditions006.htm

答案 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;