ITPub博客

首页 > Linux操作系统 > Linux操作系统 > “=》”关联操作符在Oracle 10g和11g的变化差异

“=》”关联操作符在Oracle 10g和11g的变化差异

原创 Linux操作系统 作者:realkid4 时间:2011-05-18 00:15:30 0 删除 编辑

 

关联操作符(=>)是我们在PL/SQL中经常使用到的一种参数指定操作符。借助这个操作符,可以将原有的通过顺序进行配比的参数匹配,变成可以显示进行参数指定。

 

关联操作符最开始是由PL/SQL中引入的语法特性,用来进行程序参数的指定。之后在11g中,这种特性开始融入到了SQL语句中。

 

 

10g环境下使用

 

首先,我们在10g上进行试验。

 

//查看版本信息

SQL> select * from v$version where rownum<2;

BANNER

----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – Prod

 

--PL/SQL脚本

SQL> declare

  2    i number;

  3  begin

  4    --PL/SQL Code

  5    dbms_stats.gather_table_stats(ownname => 'SYS',tablename => 'T',cascade => true);

  6  end;

  7  /

PL/SQL procedure successfully completed

 

 

上面是一段PL/SQL脚本,其中使用了=>操作符,进行存储过程的参数显示指定。一个存储过程中,可以包括多个参数,这些参数可以都包括默认值选项。如果要进行调用,就必须按照定义存储过程的顺序进行参数显示指定。

 

 

这种方式有一个很大的问题,就是默认参数的覆盖。比如一个存储过程中包括三个参数,都有默认值设置。在这种情况下,如果没有关联操作符,需要设置第三个参数的时候,就必须显示的对前两个参数进行指定。借助关联操作符,可以直接对第三个参数进行指定。

 

 

但是,这种功能只是限制在OraclePL/SQL语句中。如果要进行纯SQL的操作,Oracle10g还不能够支持。

 

 

--SQL语句中

SQL> explain plan for select count(*) from t where wner='SCOTT';

Explained

 

SQL> select * from table(dbms_xplan.display(table_name => 'plan_table',format => 'all'));

select * from table(dbms_xplan.display(table_name => 'plan_table',format => 'all'))

ORA-00907: 缺失右括号

 

SQL> select * from table(dbms_xplan.display('plan_table',null,'all'));

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

Plan hash value: 1232703844

--------------------------------------------------------------------------------

| Id  | Operation         | Name        | Rows  | Bytes | Cost (%CPU)| Time

(篇幅原因,有省略……

 

在进行SQL语句中,只能通过顺序指定参数的方式进行调用。这种方式很不方便,需要调用者熟悉所有参数的默认值,这个是不现实的。

 

 

 

Oracle11g下的改观

 

进入Oracle11g之后,关联操作符的使用变得更加广泛。

 

 

SQL> select * from v$version where rownum<2;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

 

SQL> declare

  2    i number;

  3  begin

  4    --PL/SQL Code

  5    dbms_stats.gather_table_stats(ownname => 'SYS',tabname => 'T',cascade => true); 

6 

  7  end;

  8  /

PL/SQL procedure successfully completed

 

 

传统的PL/SQL代码同样支持。下面检查SQL代码。

 

 

SQL>  explain plan for select count(*) from t where wner='SCOTT';

Explained

 

SQL> select * from table(dbms_xplan.display(format => 'all'));

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

Plan hash value: 1232703844

--------------------------------------------------------------------------------

| Id  | Operation         | Name        | Rows  | Bytes | Cost (%CPU)| Time

--------------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |             |     1 |     8 |     1   (0)| 00:00:01

|   1 |  SORT AGGREGATE   |             |     1 |     8 |            |

|*  2 |   INDEX RANGE SCAN| IDX_T_OWNER |    12 |    96 |     1   (0)| 00:00:01

--------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):

-------------------------------------------------------------

 

 

使用=>操作符,可以让我们的代码更加简洁。只需要涉及到修改的参数进行指定既可以了。

 

 

结论:关联操作符在Oracle10g下,只有PL/SQL可以使用。而进入11g之后,这个功能已经推进到SQL语句引擎中。

 

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

请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    7678792