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

2014-11-24 08:58:38 · 作者: · 浏览: 0
PL/SQL的BOOLEAN的三个值:TRUE,FALSE,NULL
Oracle的PL/SQL中的BOOLEAN类型有三个取值,分别是TRUE、FALSE以及NULL。
这三个值会给开发的时候造成不必要的麻烦,例如
www.2cto.com
[sql]
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;
www.2cto.com
上面的两个判断,均没有输出字符,因此,我们需要看一下问题出在什么地方:
[sql]
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;
www.2cto.com
原来,上面的输出结果是NULL,所以有一个规范:“我们必须要预料到布尔表达式的结果会存在NULL值,因此必须使用NVL()函数来避免不可预料的结果的发生!”。根据实际的结果值进行如下操作:
[sql]
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;
www.2cto.com
让我们来看一下,在什么情况下会出现NULL值?
[sql]
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;
www.2cto.com
输出的结果如下:
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