将变量申明为varchar2(100)就可以了。

解决方案 »

  1.   

    'a         '和'a'是不相等的
    ac_tmp1 char(100)永远是100个字符,不足100则加空格。
      

  2.   

    可能nvl(ac_tmp2,'a'))的数据类型和char不相符
    中间加一个参数试试:
    declare 
    ac_tmp1 char(100):='123 ';
    ac_tmp2 char(100):='123 ';
                      str char(100);
    begin
    ac_tmp1:='a';
    ac_tmp2:=null;
    dbms_output.put_line(to_char(nvl(ac_tmp2,'a'))); 
                      str:=nvl(ac_tmp2,'a');
                      dbms_output.put_line(str);
          
    if  str=ac_tmp1 then
       dbms_output.put_line(to_char('ac_tmp1'));   
    end if;
        
    if  ac_tmp1='a' then
       dbms_output.put_line(to_char('ac_tmp2'));   
    end if;
    if  (nvl(ac_tmp2,'a'))='a' then
       dbms_output.put_line(to_char('ac_tmp3'));   
    end if;
    end;
      

  3.   

    同意ORARichard(没钱的日子......)
      

  4.   

    nvl 函数返回的结果数据类型的问题
    用  ORARichard(没钱的日子......)  的方法,
    把变量定义成 varchar/varchar2 都可以
      

  5.   

    不好意思,把变量声明成varchar2是  
    bobfang(匆匆过客)  的看法,上面说错了
      

  6.   

    bobfang(匆匆过客) 方式是没有问题,但还是有点奇怪:
      declare 
    ac_tmp1 varchar2(100):='123 ';
    ac_tmp2 char(100):='123 ';
    begin
    ac_tmp1:=' ';
    ac_tmp2:=' ';
    if  ac_tmp1='   ' then
       dbms_output.put_line(to_char('ac_tmp1'));   
    end if;
    if  ac_tmp2='   ' then
       dbms_output.put_line(to_char('ac_tmp2'));   
    end if;
    end;
    结果是:
    ac_tmp2就是ac_tmp1没有出来,说明varchar2的变量上要完全匹配的才相等,char对空格是随意的,这样以后写过程要是不细心就很容易发生莫名的错误
      

  7.   

    ac_tmp2 char(100)
    ac_tmp2=' '实际上就是给ac_tmp2赋100个空格。if ac_tmp2='   ' then
    实际是把'   '隐式的转换成100个空格,因为ac_tmp2的类型是char,所以它们会相等
      

  8.   

    使用TRIM函数。
    不一定需要varchar2类型。
      

  9.   

    要注意char()和varchar/nvarchar()间的区别
      

  10.   


      ac_tmp2=' '  赋值后,ac_tmp2的值是100个空格,能取出100个ASCII=32的字符。
      ac_tmp2=NULL 赋值后,ac_tmp2的值是空的,取不出一个ASCII来。
     
      if ac_tmp2='XXX'  判断句,'XXX'与char(100)的数据类型ac_tmp2比较时,先把引号内的'XXX'值向后补空格自100位,再比较。即使XXX为空格。