ITPub博客

首页 > Linux操作系统 > Linux操作系统 > PL/SQL中char类型的暗门

PL/SQL中char类型的暗门

原创 Linux操作系统 作者:regonly1 时间:2010-11-08 11:44:04 0 删除 编辑
在PL/SQL编程中,char类型是一个比较鸡肋的类型,除非是在CPU要求非常高的系统,否则这种类型完全可以用varchar2来替换。
测试案例:
SQL> declare
  2      v_chr1 char(2) := '  ';
  3      v_chr2 char(2) := '';
  4      v_chr3 char(2) := null;
  5  begin
  6      dbms_output.put_line('chr1: ' || length(v_chr1));
  7      dbms_output.put_line('chr2: ' || length(v_chr2));
  8      dbms_output.put_line('chr3: ' || length(v_chr3));
  9  end;
 10  /
 
chr1: 2
chr2: 2
chr3:
 
PL/SQL procedure successfully completed
 
 说明:上面这个过程,给v_chr1、v_chr2、v_chr3分别赋予了两个空格、空字符串、null值,在输出的结果中,可以看到,v_chr1长度为2,而v_chr2长度为2,而v_chr3的长度为空。到目前为止,我们可以推出v_chr2和v_chr3实际是为空的字符串,但是下面实验却与之前矛盾:
SQL> declare
  2      v_chr2 char(2) := '';
  3      v_chr3 char(2) := null;
  4  begin
  5      dbms_output.put_line(case v_chr2 when null then 0 else 1 end);
  6      dbms_output.put_line(case v_chr3 when null then 0 else 1 end);
  7  end;
  8  /
 
1
1
 
PL/SQL procedure successfully completed
这个过程做了一个条件测试,如果为空,则打印0,否则打印1。结果显示为1,即表明这两个变量都不是空的。此时,我们延伸出空字符串和null在变量的赋值中并不是所有情况都相同的。
char类型的这个暗门,在此处已经不容易被看出来,还有中情况更难识别,比如说有表:
tab(x char(2));
在调用中,与tab.x绑定类型:
declare
    x tab.x%type;
begin
    dbms_output.put_line(length(x));
end;
这个时候,就更难看出来了。有时候,这种问题会直接导致代码目的与实际所需要达到的要求背离。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12932950/viewspace-677704/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-05-10

  • 博文量
    257
  • 访问量
    1069895