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 --