使用常量时候的自动补齐动作不再生效了!这就表明:优化器在处理常量时候,有一些特殊的规则逻辑,这部分在应用函数之后就不再使用了。另外一种可能性就是针对等号两端取值进行类型匹配的时候,常量和函数量的取值方式是有差别的。rpad返回的虽然是一个字符类型,但是变长度还是固定长度是不容易确定的。如果Oracle将常量认可为char,rpad结果认可为varchar2,那么结果不一样是可以理解的。
4、绑定变量处理
SQL优化器是目前Oracle中非常复杂的组件之一。其中很多步骤和逻辑都需要我们不断地进行测试和合理猜测得到的。绑定变量是我们在实际开发过程中常常使用的技术之一。下面我们测试一下在PL/SQL代码片段中绑定变量的使用。
SQL> declare
2 a char(100);
3 coun number;
4 begin
5 a := 'SCOTT';
6 execute immediate 'select count(*) from t where chr_a=:1'
7 into coun
8 using a;
9 dbms_output.put_line('Result Is : '||to_char(coun));
10 end;
11 /
Result Is : 6
PL/SQL procedure successfully completed
绑定变量使用上,关键的一个问题就是绑定变量定义的类型。在上面的代码中,如果使用了char类型的变量,虽然定义取值的时候后面没有空格,Oracle还是事先了常量变量中的“自动补齐动作”。
如果和常量时候一样,赋值是有空格结尾的,那么会如何呢?
SQL> set serveroutput on size 10000;
SQL> declare
2 a char(100);
3 coun number;
4 begin
5 a := 'SCOTT ';
6 execute immediate 'select count(*) from t where chr_a=:1'
7 into coun
8 using a;
9 dbms_output.put_line('Result Is : '||to_char(coun));
10 end;
11 /
Result Is : 6
PL/SQL procedure successfully completed
效果相同。那么,可以得到结论:如果使用char类型的绑定变量,效果和常量是一样的。那么,如果使用varchar2类型绑定变量,效果如何呢?
SQL> declare
2 a varchar(100);
3 coun number;
4 begin
5 a := 'SCOTT';
6 execute immediate 'select count(*) from t where chr_a=:1'
7 into coun
8 using a;
9 dbms_output.put_line('Result Is : '||to_char(coun));
10 end;
11 /
Result Is : 0
PL/SQL procedure successfully completed
SQL> set serveroutput on size 10000;
SQL> declare
2 a varchar(100);
3 coun number;
4 begin
5 a := 'SCOTT ';
6 execute immediate 'select count(*) from t where chr_a=:1'
7 into coun
8 using a;
9 dbms_output.put_line('Result Is : '||to_char(coun));
10 end;
11 /
Result Is : 0
PL/SQL procedure successfully completed
如果绑定变量明确是varchar2,自动补齐效果是不发生的!和之前函数的问题是没有关系的。如果我们在char类型中使用rpad函数进行赋值,看结果应该是可以进行自动补齐的。
SQL> set serveroutput on size 10000;
SQL> declare
2 a char(100);
3 coun number;
4 begin
5 a := rpad('SCOTT',10,' ');
6 execute immediate 'select count(*) from t where chr_a=:1'
7 into coun
8 using a;
9 dbms_output.put_line('Result Is : '||to_char(coun));
10 end;
11 /
Result Is : 6
PL/SQL procedure successfully completed
结果和预计相同。
5、结论
综合上述的实验分析,我们可以得到如下结论:
对char类型,优化器方面会有一定的优化动作,主要在于末尾空格的自动补齐动作;
但是,自动补齐动作出现的条件是类型的匹配,就是进行比较时候变量类型一定是char类型;
如果是varchar2类型,自动补齐动作是不会出现的;