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部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-594667/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 轉:10g新增功能實現字串連線字串
- [資料庫連線字串] Access 連線字串(轉)資料庫字串
- [資料庫連線字串]Access連線字串(轉)資料庫字串
- MySQL字串連線MySql字串
- mongodb連線字串MongoDB字串
- SCSS 字串連線符CSS字串
- matlab連線字串Matlab字串
- oracle中字串連線Oracle字串
- not in 用外連線實現
- 純css實現的擷取字串功能CSS字串
- CrossApp V1.0.1新增動畫與連線wifi功能喜迎羊年ROSAPP動畫WiFi
- 各種連線資料庫的連線字串資料庫字串
- MySQL字串連線函式MySql字串函式
- ASPNET中連線字串字串
- Oracle字串連線的方法Oracle字串
- 連線字串的SQL方法字串SQL
- 資料庫連線字串資料庫字串
- gorose orm新版本(0.8.0)釋出,新增連線池等特色功能GoROSORM
- JavaScript 字串連線效能比較JavaScript字串
- ADO.NET連線字串字串
- C#連線SQLite的字串C#SQLite字串
- Awk 字串連線操作(字串轉數字,數字轉字串)字串
- [譯] Go 實現百萬 WebSocket 連線GoWeb
- Swoole MySQL 連線池的實現MySql
- 實現一個redis連線池Redis
- Python實現MySQL連線池PythonMySql
- Django使用channels實現Websocket連線DjangoWeb
- ofbiz 連線池如何實現?
- mysql的jdbc連線java實現MySqlJDBCJava
- 資料庫連線池實現資料庫
- 10G client連線資料庫client資料庫
- UITableView實現下拉重新整理新增資料功能UIView
- android: 實現強制下線功能Android
- golang 幾種字串的連線方式Golang字串
- SQL連線符與使用字串SQL字串
- js字串連線簡單介紹JS字串
- JavaScript 陣列元素連線成字串JavaScript陣列字串
- 用連結串列實現佇列的功能佇列