ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 10g新增功能实现字符串连接

10g新增功能实现字符串连接

原创 Linux操作系统 作者:yangtingkun 时间:2009-05-10 22:57:43 0 删除 编辑

9i中,没有这个功能,因此字符串的连接只能通过自定义聚集函数实现,在我的BLOG中第一篇文章就是介绍实现这个功能的。除了自定义聚集函数外,利用SQL也能实现这个功能。在前面有一些文章专门描述这些问题。

对字符串的“sum”——在Oracle中自定义聚集函数的例子:http://yangtingkun.itpub.net/post/468/3380

连接字符串的SQL方法:http://yangtingkun.itpub.net/post/468/388003

字符串连接超长的解决(一):http://yangtingkun.itpub.net/post/468/482093

字符串连接超长的解决(二):http://yangtingkun.itpub.net/post/468/482122

 

 

不过在10g中,这个问题已经很不需要这么麻烦了,前两天和junsansi聊天,他提到10g中有专门实现这个功能的函数了。

SQL> SELECT * FROM V$VERSION;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

SQL> DESC WMSYS.WM_CONCAT
FUNCTION WMSYS.WM_CONCAT RETURNS VARCHAR2
参数名称                       类型                    输入/输出默认值?
------------------------------ ----------------------- ------ --------
 P1                             VARCHAR2                IN

SQL> SELECT WMSYS.WM_CONCAT(TNAME) FROM TAB;

WMSYS.WM_CONCAT(TNAME)
-------------------------------------------------------------------------------------------
T_PARTITION,T_PART,CHAINED_ROWS,T_NO_EXISTS_BEFORE,T_CHAR,T_LOAD_SPACE,T_LEVEL,T_LEVEL1,T_TREE,T_RECGTK,T_FUNCTION,T_TAB,T_SESSION_STAT,T_TEMP2,SYS_EXPORT_SCHEMA_01,MV_T,T_INDEX_ORG,T_PART_RANGE,C_TEST_256,T_NUM,MV_T_NUM,C_HASH,T_HASH,TEST,T_PART_INDEX,RUPD$_MV_T,MLOG$_MV_T,T_EXTERNAL2,T_EXTERNAL_LO_ERROR_LOG1,V_T,T1,T2

那么Oracle是如何实现这个功能的,是否也是使用了自定义聚集函数呢:

SQL> SELECT TEXT
  2  FROM DBA_SOURCE
  3  WHERE WNER = 'WMSYS'
  4  AND NAME = 'WM_CONCAT'
  5  ORDER BY LINE;

TEXT
-------------------------------------------------------------------------
function       wm_concat wrapped
a000000
1
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
8
58 89
G2IOCTwNs2RlB9JzCCQPJq/UuH0wg8eZgcfLCNL+Xuf+8L8z/sefdLPnfMPnx3TAM7h0ZSXD
j57Asr2ym9ZtFldFmFu+RdpAU8VGORKSvh2BRIA5Hq8yxhKSOc4WVIKmpu8+Hw0=

不出意外,Oracle对这个函数的实现进行了封装,不过看代码量而言,这个实现实在是短的很,怀疑这个函数也是利用自定义聚集函数来实现的功能。

自定义聚集函数实现的方法需要借助TYPE类型,那么查看一下Oracle实现的这个函数是否会依赖TYPE类型来实现:

SQL> SELECT NAME, TYPE, REFERENCED_OWNER, REFERENCED_NAME, REFERENCED_TYPE
  2  FROM DBA_DEPENDENCIES
  3  WHERE WNER = 'WMSYS'
  4  AND NAME = 'WM_CONCAT';

NAME       TYPE        REFERENCED_OWNER     REFERENCED_NAME                REFERENCED_TYPE
---------- ----------- -------------------- ------------------------------ ---------
WM_CONCAT  FUNCTION    SYS                  STANDARD                       PACKAGE
WM_CONCAT  FUNCTION    SYS                  SYS_STUB_FOR_PURITY_ANALYSIS   PACKAGE
WM_CONCAT  FUNCTION    PUBLIC               WMSYS                          NON-EXISTENT
WM_CONCAT  FUNCTION    WMSYS                WM_CONCAT_IMPL                 TYPE
WM_CONCAT  FUNCTION    WMSYS                WMSYS                          NON-EXISTENT

果然这个函数的实现依赖了WM_CONCAT_IMPL这个TYPE,虽然Oracle对这个TYPE也进行了WRAP,但是根据各种现象,已经可以确定,Oracle实现这个功能就是利用了自定义聚集函数的方法,只不过10g不需要用户自己来创建这个TYPEFUNCTION

对于大部分情况,可以直接使用Oracle提供的功能,不过如果由于分隔符不同,或者连接字符串长度超长等问题,还是需要用户实现自己的字符串连接过程。

 

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

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10441618