在Oracle資料庫中,進列欄位合并,可以使用wm_concat(column)函數,但是在這種方法不被Oracle所推薦,因為WMSYS使用者用於Workspace Manager,其函數對象可能因版本而不同而出現異常,這種變化在11.2.0.3及10.2.0.5中體現出來。原本WM_CONCAT函數傳回值為VARCHAR2,但在一些版本下就會變更為CLOB。這一變化導致了很多程式的異常。
Oracle建議使用者使用自訂函數來實現該功能,而不是使用WorkSpace的這個內建函式。這個函數包含一個Type、Type Body、Function,可以參考Oracle的實現方式來實現這個函數。
下面分別介紹oracle中wm_concat(column)函數的使用和多行記錄合并自訂函數 zh_concat
一、oracle中wm_concat(column)函數的使用
t_student表:
SNAME SDREE SAGE SEX
李坤 天融信 26 男
曹貴生 中銀 26 男
柳波 買賣寶 27 男
紀爭光 IBM 23 女
李學宇 微軟 25 女
李雪琪 文思 25 女
陳緒 中海油 26 男
韓正陽 中海油 24 男
陳偉東 中核 24 男
劉兵 優酷 24 男
丁成雲 聯想 25 女
王鵬 中興 25 男
想要的結果為:
--------------------------------
男 李坤,曹貴生,柳波,陳偉東,韓正陽,陳緒,劉兵,王鵬
女 紀爭光,李學宇,丁成雲,李雪琪
---------------------------------
SQL語句為:
select t.sex,wmsys.wm_concat(t.sname)from t_student tgroup by t.sex
二、自訂函數zh_concat(從網上摘,直接可用)
wm_concat出現在oracle10g版本中,不僅是加密的,而且是在一個單獨的使用者中,不方便使用。並且10g以前的版本也用不上。經過破解移植,可以方便大家使用
將下邊的一個type,一個函數的建立指令碼執行,就可以構建自己的wm_concat(這裡叫zh_concat)。使用方法同wm_concat:
type:
create or replace TYPE zh_concat_im
AUTHID CURRENT_USER AS OBJECT
(
CURR_STR VARCHAR2(32767),
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT zh_concat_im) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT zh_concat_im,
P1 IN VARCHAR2) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN zh_concat_im,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT zh_concat_im,
SCTX2 IN zh_concat_im) RETURN NUMBER
);
/
create or replace TYPE BODY zh_concat_im
IS
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT zh_concat_im)
RETURN NUMBER
IS
BEGIN
SCTX := zh_concat_im(NULL) ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT zh_concat_im,
P1 IN VARCHAR2)
RETURN NUMBER
IS
BEGIN
IF(CURR_STR IS NOT NULL) THEN
CURR_STR := CURR_STR || ':' || P1;
ELSE
CURR_STR := P1;
END IF;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN zh_concat_im,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)
RETURN NUMBER
IS
BEGIN
RETURNVALUE := CURR_STR ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT zh_concat_im,
SCTX2 IN zh_concat_im)
RETURN NUMBER
IS
BEGIN
IF(SCTX2.CURR_STR IS NOT NULL) THEN
SELF.CURR_STR := SELF.CURR_STR || ':' || SCTX2.CURR_STR ;
END IF;
RETURN ODCICONST.SUCCESS;
END;
END;
/
函數:
create or replace FUNCTION zh_concat(P1 VARCHAR2)
RETURN VARCHAR2 AGGREGATE USING zh_concat_im ;
SPFILE 錯誤導致資料庫無法啟動(ORA-01565)
ORA-01172、ORA-01151錯誤處理
ORA-00600 [2662]錯誤解決