您的位置:首页 > 产品设计 > UI/UE

PL/SQL的BOOLEAN的三个值:TRUE,FALSE,NULL

2013-02-06 09:06 323 查看
Oracle的PL/SQL中的BOOLEAN类型有三个取值,分别是TRUE、FALSE以及NULL。这三个值会给开发的时候造成不必要的麻烦,例如


DECLARE
  B_FLAG_TRUE BOOLEAN := TRUE;
  B_FLAG_FALSE BOOLEAN := FALSE;
  B_FLAG_NULL BOOLEAN :=NULL;
BEGIN
    IF (B_FLAG_NULL AND B_FLAG_TRUE) THEN
        DBMS_OUTPUT.PUT_LINE('NULL AND TRUE');
    END IF;
    IF NOT (B_FLAG_NULL AND B_FLAG_TRUE) THEN
        DBMS_OUTPUT.PUT_LINE('NOT (NULL AND TRUE)');
    END IF;
END;



上面的两个判断,均没有输出字符,因此,我们需要看一下问题出在什么地方:

DECLARE
  B_FLAG_TRUE BOOLEAN := TRUE;
  B_FLAG_FALSE BOOLEAN := FALSE;
  B_FLAG_NULL BOOLEAN :=NULL;
  B_FLAG_RESULT BOOLEAN;
  FUNCTION TSBOOLEAN (B_FLAG BOOLEAN)RETURN VARCHAR2 IS
    BEGIN
      RETURN CASE B_FLAG
                     WHEN TRUE THEN 'TRUE'
                     WHEN FALSE THEN 'FALSE'
                     ELSE 'NULL'
                  END;
  END TSBOOLEAN;
BEGIN
  B_FLAG_RESULT :=(B_FLAG_NULL AND B_FLAG_TRUE) ;
  DBMS_OUTPUT.PUT_LINE(TSBOOLEAN(B_FLAG_RESULT));
    IF B_FLAG_RESULT THEN
        DBMS_OUTPUT.PUT_LINE(''||'==>'||'');
    END IF;
    IF NOT B_FLAG_RESULT THEN
        DBMS_OUTPUT.PUT_LINE(''||'==>'||'');
    END IF;
END;


原来,上面的输出结果是NULL,所以有一个规范:“我们必须要预料到布尔表达式的结果会存在NULL值,因此必须使用NVL()函数来避免不可预料的结果的发生!”。根据实际的结果值进行如下操作:
DECLARE
  B_FLAG_TRUE BOOLEAN := TRUE;
  B_FLAG_FALSE BOOLEAN := FALSE;
  B_FLAG_NULL BOOLEAN :=NULL;
  B_FLAG_RESULT BOOLEAN;
BEGIN
  B_FLAG_RESULT := (NVL(B_FLAG_NULL,FALSE) AND B_FLAG_TRUE);
    IF (B_FLAG_RESULT) THEN
        DBMS_OUTPUT.PUT_LINE('NULL AND TRUE');
    END IF;
    IF NOT B_FLAG_RESULT THEN
        DBMS_OUTPUT.PUT_LINE('NOT (NULL AND TRUE)');
    END IF;
END;


让我们来看一下,在什么情况下会出现NULL值?
DECLARE
    TYPE T_ARR IS  ARRAY(3) OF BOOLEAN;
    B_ARRAY T_ARR := T_ARR(TRUE,FALSE,NULL);
    B_FLAG BOOLEAN;
    V_STR VARCHAR2(100);
   FUNCTION TSBOOLEAN (B_FLAG BOOLEAN)RETURN VARCHAR2 IS
    BEGIN
      RETURN CASE B_FLAG
                     WHEN TRUE THEN 'TRUE'
                     WHEN FALSE THEN 'FALSE'
                     ELSE 'NULL'
                  END;
    END TSBOOLEAN;
BEGIN
  FOR K IN 1..2 LOOP
     FOR I IN 1..3 LOOP
       FOR J IN 1..3 LOOP
          V_STR :=TSBOOLEAN(B_ARRAY(I));
          IF K = 1 THEN 
            V_STR := V_STR||' AND ';
            B_FLAG := (B_ARRAY(I) AND B_ARRAY(J));
          ELSE
            V_STR := V_STR||' OR ';
            B_FLAG := (B_ARRAY(I) OR B_ARRAY(J));
          END IF;
          V_STR := V_STR||TSBOOLEAN(B_ARRAY(J))||' ==> ';
          DBMS_OUTPUT.PUT_LINE (V_STR||TSBOOLEAN(B_FLAG));
       END LOOP;
     END LOOP;
  END LOOP;
END;


输出的结果如下:
TRUE AND TRUE ==> TRUE
TRUE AND FALSE ==> FALSE
TRUE AND NULL ==> NULL
FALSE AND TRUE ==> FALSE
FALSE AND FALSE ==> FALSE
FALSE AND NULL ==> FALSE
NULL AND TRUE ==> NULL
NULL AND FALSE ==> FALSE
NULL AND NULL ==> NULL
TRUE OR TRUE ==> TRUE
TRUE OR FALSE ==> TRUE
TRUE OR NULL ==> TRUE
FALSE OR TRUE ==> TRUE
FALSE OR FALSE ==> FALSE
FALSE OR NULL ==> NULL
NULL OR TRUE ==> TRUE
NULL OR FALSE ==> NULL
NULL OR NULL ==> NULL
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: