Oracle 11g中的char类型使用(3)

使用常量时候的自动补齐动作不再生效了!这就表明:优化器在处理常量时候,有一些特殊的规则逻辑,这部分在应用函数之后就不再使用了。另外一种可能性就是针对等号两端取值进行类型匹配的时候,常量和函数量的取值方式是有差别的。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类型,自动补齐动作是不会出现的;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/df1b630696950fbc4747c9dd9d0dc3af.html