declare
 str varchar(1);
begin
  str:='h';
  if str != '' then
     DBMS_OUTPUT.PUT_LINE('hello world'||str);
  else
     DBMS_OUTPUT.PUT_LINE('ha ha NULL');
  end if;
end;运行结果为:ha ha NULL
请帮忙解释一下原因或运行机制

解决方案 »

  1.   

    oracle中,把varchar的空字符串''和null认为是等同的。
    因为任何与null的运算结果都为null,也就是说表达式
    str   !=   ''   在运算时为了类型匹配,先把''隐式转换成null,然后再与str进行比较运算,也就是 str != null,
    毫无疑问,运算的的结果是 null,而不是true.
    所以流程转到
    else
      DBMS_OUTPUT.PUT_LINE('ha   ha   NULL'); 而char就不一样了,''就是'',不是null,楼主可以试试。
    爱好oracle,共同学习。
    参考:
    http://blog.csdn.net/truexf/archive/2007/10/12/1820977.aspx
      

  2.   

    我试了一下,使用char也一样是null
      

  3.   

    是的。我前面说错了。我原先的理解也有些问题。
    我也测试了一下。应该是oracle把空字符串认为是null,与varchar 或char没关系。