【函式引數】Oracle 11g中使用“=>”顯式指明函式引數名與引數值的對應關係

secooler發表於2010-05-08
11g中可以使用“=>”完成函式引數的資料指定。如果在11g中編寫指令碼或程式,可以使用這個小技巧在呼叫函式時給出引數名字與引數值的對應關係,方便閱讀的同時也提高了錯誤排查的效率,更重要的是,我們因此有了更大的靈活度——可以隨心所欲的調整引數的順序。
這裡我以“dbms_metadata.get_ddl”函式的呼叫過程來演示一下這個小技巧,供參考。

1.建立表T
create table t (x number(2));

11g資料庫版本資訊如下:
sec@11gR2> select * from v$version;

BANNER
-----------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

2.“dbms_metadata.get_ddl”的通用方法
sec@11gR2> select dbms_metadata.get_ddl('TABLE','T','SEC') from dual;

DBMS_METADATA.GET_DDL('TABLE','T','SEC')
----------------------------------------------------------------------

  CREATE TABLE "SEC"."T"
   (    "X" NUMBER(2,0)
   ) SEGMENT CREATION DEFERRED
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  TABLESPACE "TBS_SEC_D"

3.在11g環境中使用“=>”完成引數的傳遞
1)dbms_metadata.get_ddl的引數描述資訊(可以透過“desc dbms_metadata”獲得)
FUNCTION GET_DDL RETURNS CLOB
 Argument Name         Type                    In/Out Default?
 --------------------- ----------------------- ------ --------
 OBJECT_TYPE           VARCHAR2                IN
 NAME                  VARCHAR2                IN
 SCHEMA                VARCHAR2                IN     DEFAULT
 VERSION               VARCHAR2                IN     DEFAULT
 MODEL                 VARCHAR2                IN     DEFAULT
 TRANSFORM             VARCHAR2                IN     DEFAULT

2)在確定具體的引數名稱後便可以使用“=>”完成引數的賦值
sec@11gR2> select dbms_metadata.get_ddl(OBJECT_TYPE=>'TABLE',NAME=>'T',SCHEMA=>'SEC') from dual;

DBMS_METADATA.GET_DDL(OBJECT_TYPE=>'TABLE',NAME=>'T',SCHEMA=>'SEC')
----------------------------------------------------------------------

  CREATE TABLE "SEC"."T"
   (    "X" NUMBER(2,0)
   ) SEGMENT CREATION DEFERRED
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  TABLESPACE "TBS_SEC_D"

可見,該語法已經生效,結果與通用的方法一致(必然)。

該方法更重要的的意義在於,我們從此不用再為引數的“固定順序”而苦惱。
我們可以按照我們的思維習慣來組織引數的順序,例如我們按照如下順序完成查詢:查詢在某一Schema下某類資料庫物件型別中的具體資料庫物件的定義資訊。
sec@11gR2> select dbms_metadata.get_ddl(SCHEMA=>'SEC',OBJECT_TYPE=>'TABLE',NAME=>'T') from dual;

DBMS_METADATA.GET_DDL(SCHEMA=>'SEC',OBJECT_TYPE=>'TABLE',NAME=>'T')
----------------------------------------------------------------------

  CREATE TABLE "SEC"."T"
   (    "X" NUMBER(2,0)
   ) SEGMENT CREATION DEFERRED
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  TABLESPACE "TBS_SEC_D"

4.對比10g中使用效果
1)“dbms_metadata.get_ddl”的通用方法
sec@ora10g> select dbms_metadata.get_ddl('TABLE','T','SEC') from dual;

DBMS_METADATA.GET_DDL('TABLE','T','SEC')
----------------------------------------------------------------------

  CREATE TABLE "SEC"."T"
   (    "X" NUMBER(2,0)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "TBS_SEC_D"

此時,可以得到T表的定義資訊,但是引數的使用順序是固定的。

2)此時如果使用“=>”進行引數複製將會報錯
sec@ora10g> select dbms_metadata.get_ddl(OBJECT_TYPE=>'TABLE',NAME=>'T',SCHEMA=>'SEC') from dual;
select dbms_metadata.get_ddl(OBJECT_TYPE=>'TABLE',NAME=>'T',SCHEMA=>'SEC') from dual
                                        *
ERROR at line 1:
ORA-00907: missing right parenthesis

此處報錯資訊暗示SQL語法不正確,根本原因是10g中還未支援此項功能。

5.小結
每一項新技術都有它存在的意義,存在即合理。例如文中介紹的Oralce小改進,在11g環境中中使用這個小技巧將會使我們編寫出來的程式或指令碼更具可讀性,同時也會避免因引數傳遞順序問題導致指令碼無法正常執行。

Good luck.

secooler
10.05.08

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-662262/,如需轉載,請註明出處,否則將追究法律責任。

相關文章