【函式引數】Oracle 11g中使用“=>”顯式指明函式引數名與引數值的對應關係
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 --
這裡我以“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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 函式中引數傳值函式
- javascript函式引數和函式內同名變數的關係JavaScript函式變數
- 函式定義、函式的引數、函式的預設引數函式
- 函式引數 引數定義函式型別函式型別
- 程式中的函式引數函式
- 函式的關鍵字引數函式
- Swift 1.1語言函式引數的特殊情況本地引數名外部引數名Swift函式
- Excel函式應用教程:函式的引數(轉)Excel函式
- 07:函式之函式的引數和返回值函式
- 細說函式返回值與引數函式
- Javascript函式引數求值——Thunk函式JavaScript函式
- 函式基礎和函式引數函式
- 3.3.2 函式的預設引數和佔位引數 函式過載函式
- Python函式/動態引數/關鍵字引數Python函式
- 函式、引數、解構函式
- 函式引數詳解函式
- JavaScript函式引數解構賦值JavaScript函式賦值
- 函式的引數傳遞函式
- 函式引數的 Default value函式
- PHP函式,引數,可變參函式.PHP函式
- 4.2 函式的外部引數名 [Swift教程]函式Swift
- 反射如何獲取函式的引數名反射函式
- 函式呼叫引數變數傳值的問題函式變數
- Oracle帶引數的自定義函式Oracle函式
- 關於C++引用做為函式引數和指標作為函式引數C++函式指標
- php 的函式引數值型別限定PHP函式型別
- php的函式引數值型別限定PHP函式型別
- 方法(函式)的定義與引數函式
- Python函式的位置引數、關鍵字引數精講Python函式
- C++行內函數、函式過載與函式預設引數C++函數函式
- TypeScript 函式可選引數和預設引數TypeScript函式
- 物聯網學習教程—函式引數和函式的值函式
- Python 函式 (關鍵字引數)Python函式
- ES6函式引數函式
- JavaScript函式傳遞引數JavaScript函式
- Python: 函式引數魔法Python函式
- JavaScript函式引數傳遞JavaScript函式
- 陣列作為函式引數陣列函式