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;
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对空格是随意的,这样以后写过程要是不细心就很容易发生莫名的错误
ac_tmp2 char(100) ac_tmp2=' '实际上就是给ac_tmp2赋100个空格。if ac_tmp2=' ' then 实际是把' '隐式的转换成100个空格,因为ac_tmp2的类型是char,所以它们会相等
ac_tmp1 char(100)永远是100个字符,不足100则加空格。
中间加一个参数试试:
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;
用 ORARichard(没钱的日子......) 的方法,
把变量定义成 varchar/varchar2 都可以
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对空格是随意的,这样以后写过程要是不细心就很容易发生莫名的错误
ac_tmp2=' '实际上就是给ac_tmp2赋100个空格。if ac_tmp2=' ' then
实际是把' '隐式的转换成100个空格,因为ac_tmp2的类型是char,所以它们会相等
不一定需要varchar2类型。
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为空格。