PL/SQL的BOOLEAN的三个值:TRUE,FALSE,NULL
2013-02-06 09:06
323 查看
Oracle的PL/SQL中的BOOLEAN类型有三个取值,分别是TRUE、FALSE以及NULL。这三个值会给开发的时候造成不必要的麻烦,例如
上面的两个判断,均没有输出字符,因此,我们需要看一下问题出在什么地方:
原来,上面的输出结果是NULL,所以有一个规范:“我们必须要预料到布尔表达式的结果会存在NULL值,因此必须使用NVL()函数来避免不可预料的结果的发生!”。根据实际的结果值进行如下操作:
让我们来看一下,在什么情况下会出现NULL值?
输出的结果如下:
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
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
相关文章推荐
- PL/SQL的BOOLEAN的三个值:TRUE,FALSE,NULL
- PL/SQL的Boolean的三个值:TRUE,FALSE,NULL两两进行AND,OR操作的值
- 数据库 SQL :有关 NULL 值引发 TRUE、FALSE、UNKNOW 三值逻辑
- php中0,'',null,false,true,FLASE,TREU,array()的相等恒等学习
- fasterxml: Unrecognized token '***': was expecting ('true', 'false' or 'null')
- PL/SQL Boolean类型
- null返回的true or false
- jquery 将字符串false/true转换成Boolean类型
- Jersey项目报错:Unrecognized token 'id': was expecting ('true', 'false' or 'null') ...
- 解决pl/sql登录时只有三个选项和ORA-12154的问题
- js中的undefined,null,空字符串,false,true之间的关系
- SQLSERVER TRUE、FALSE、UNKNOWN
- php中0,'',null,false,true,FLASE,TREU,array()的相等恒等学习
- app.json Expecting 'STRING','NUMBER','NULL','TRUE','FALSE','{','[',']', got INVALID
- 解决 调PL/SQL存储过程报 trailing null missing from STR bind value 的问题
- PL/SQL每日一题:含有NULL的IF条件
- getSession(boolean true) getSession getSession(boolean false) 的关系和区别
- Java_语法基础_true false与null
- JavaScript中为什么null==0为false而null大于=0为true(个人研究)
- pl/sql SP中常见三个报错(fetch out of sequence,invalid ROWID,numeric or value error)