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

来源:互联网 发布:手机上视频录像软件 编辑:程序博客网 时间:2024/05/18 17:02
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
  
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 大头笔写的字褪色了怎么办 小画板用记号笔画了擦不下来怎么办 新换的大灯和原大灯有色差怎么办? 微信信息写好没有发送两字怎么办 3d模型导进去 材质丢失怎么办 3d模型导入材质没了怎么办 淘宝上的电视尺寸与实际不符怎么办 医师面试题号忘了写怎么办 淘宝买东西东西被别人拿走了怎么办 9个月宝宝上肢支撑不好怎么办 宝宝快十一个月了留口水怎么办 两岁宝宝不会自己登着大小便怎么办 小新家的房子被炸了房贷怎么办 怀孕8个月感冒鼻窦炎头疼怎么办 买的全身镜下面的框子坏了怎么办 单位上司姐姐每天要接我上班怎么办 企业微信公众号中的文章边框怎么办 怎么办我在数学答题卡上画了分割线 游泳的时候泳裙飘起来怎么办 两岁宝宝误服了酵素梅怎么办 人被困在山洞里没有氧气怎么办? 一个人太爱你可你不爱他怎么办 牙齿还没掉又长了新牙齿怎么办 两岁宝宝牙齿发黑烂牙怎么办 怀孕八个月被小孩压到肚子了怎么办 在花场上班客人约我出去玩怎么办 小天才电话手表开不了机怎么办 黑色笔芯弄在白色衣服上怎么办 su文件打开是意外的格式怎么办 su卡的动一下就卡怎么办 犀牛vary渲染的太曝光了怎么办 脑子老是乱想幻想控制不住怎么办 猫抓了破了点皮怎么办 小孩子喜欢玩别人家的玩具怎么办 孩子把别人家的玩具玩坏了怎么办 小新和爸妈一起睡觉那他们怎么办 ps画纸画的时候一直在移动怎么办 宝宝磕碰到家具上鼻梁碰破该怎么办 月经推迟11天了怎么办孕测棒单杠 小孩子不小心把蜡笔吃一点怎么办 线切割切割的工件表面有条纹怎么办