在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;
这个时候,就更难看出来了。有时候,这种问题会直接导致代码目的与实际所需要达到的要求背离。
测试案例:
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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12932950/viewspace-677704/