首页 > Linux操作系统 > Linux操作系统 > 10g新增功能实现字符串连接
在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不需要用户自己来创建这个TYPE和FUNCTION。
对于大部分情况,可以直接使用Oracle提供的功能,不过如果由于分隔符不同,或者连接字符串长度超长等问题,还是需要用户实现自己的字符串连接过程。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-594667/ ,如需转载,请注明出处,否则将追究法律责任。