10g新增功能實現字串連線

yangtingkun發表於2009-05-10

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章