【函数参数】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 --

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

转载于:http://blog.itpub.net/519536/viewspace-662262/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值