on_flag <> 1
如果on_flag 是NULL不是这样判断,而是 if on_flag is null  then   on_flag := 0;end if;

解决方案 »

  1.   

    if on_flag is null then
      

  2.   

    应该是
    if on_flag is null  then   on_flag := 0;end if;
      

  3.   

    我知道可以写成if on_flag is null  then 但是我不明白为什么回出现那种错误,明明时null可是在判断时把他当成1了,这是为什么
    IF on_flag <> 1 THEN
    on_flag := 0;
    END IF;
      

  4.   

    我明白我这个过程写的是不严密,但是在理论上他是对的,也就是一个变量是空的话 那么我判断他是否等于1 他应该不等于1,可是实际他等于1了,难道这是个bug还是有另外的解释,我想确认一下
      

  5.   

    null比较特殊他表示lack of data,不能和一个值进行比较,只能用IS NULL and IS NOT NULL.来判断,对于IF on_flag <> 1 THEN这样的语句如果on_flag是null,oracle返回的结果是未知的(UNKNOWN)可能会被当成false,当然不会执行on_flag := 0;,可以这样IF on_flag is null or on_flag <> 1 THEN
      

  6.   

    另外,初始化时不管用的!在其他赋值的地方(如fetch into等)也可能被赋成null
      

  7.   

    最好在定义这个flag是定义一个初始值.declare
      on_flag number(1) := 0;
    ...
    begin
    ...
      

  8.   

    楼上的大虾们说的都很好,这样的解释搂主该满意了吧,其实你要是想更多的了解null的用法,
    最好去网上找一些资料,用专门的关于null的用法介绍,也涉及到了null和1的区别。
      

  9.   

    凑个热闹,NULL确实是不能与1比较的。
      

  10.   

    这样说吧,NULL即不等于1,也不不等于1,所以不满足IF on_flag <> 1 THEN,当然就不会on_flag := 0;因为你没有对on_flag赋默认值,所以返回的是Null
      

  11.   

    这实际上是一个ORACLE的基础问题。
    记住,在将变量与NULL进行比较时,不能使用=或者<>,不然结果都是false。
    ORACLE要求使用is null进行比较。
    这没有什么道理可说,是数据库供应商的一个约定。