“=》”關聯運算子在Oracle 10g和11g的變化差異

realkid4發表於2011-05-18

 

關聯運算子(=>)是我們在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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章