WM_CONCA函式兩行合成一行資料
該函式可以實現行列轉換:wmsys.wm_concat
wmsys.wm_concat物件實現行列轉換的方法,在11.2.0.3及10.2.0.5有所變化。原本WM_CONCAT函式返回值為VARCHAR2變更為CLOB。這一變化導致了很多程式的異常
11g:
SQL> desc wmsys.wm_concat
Parameter Type Mode Default?
--------- -------- ---- --------
(RESULT) CLOB
P1 VARCHAR2 IN
WM_CONCAT 11g 返回clob欄位 ,但是關聯其他表varchar2欄位會報錯,所以需要將WM_CONCAT函式返回來的值輸出varchar2 才可以和其他表關聯。
解決辦法如下:
如下一個系列的函式,可以幫助使用者構建自有的行列轉換函式:(自己可以選擇返回值 clob 、varchar2)
建立type:
create or replace TYPE en_concat_im
AUTHID CURRENT_USER AS OBJECT
(
CURR_STR VARCHAR2(32767),
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT en_concat_im) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT en_concat_im,
P1 IN VARCHAR2) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN en_concat_im,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT en_concat_im,
SCTX2 IN en_concat_im) RETURN NUMBER
);
建立包體:
create or replace TYPE BODY en_concat_im
IS
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT en_concat_im)
RETURN NUMBER
IS
BEGIN
SCTX := en_concat_im(NULL) ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT en_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 en_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 en_concat_im,
SCTX2 IN en_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 en_concat(P1 VARCHAR2) RETURN VARCHAR2 AGGREGATE USING en_concat_im ;
檢視:
select en_concat((result)=>username) username from dba_users;
username
——————————————————————————————
SYS;SYSTEM;SCOTT;REPORT;OUTLN;MGMT_VIEW;FLOWS_FILES;MDSYS;ORDSY
select en_concat(P1 => username) from dba_users;
username
——————————————————————————————
SYS;SYSTEM;SCOTT;REPORT;OUTLN;MGMT_VIEW;FLOWS_FILES;MDSYS;ORDSY
wmsys.wm_concat物件實現行列轉換的方法,在11.2.0.3及10.2.0.5有所變化。原本WM_CONCAT函式返回值為VARCHAR2變更為CLOB。這一變化導致了很多程式的異常
11g:
SQL> desc wmsys.wm_concat
Parameter Type Mode Default?
--------- -------- ---- --------
(RESULT) CLOB
P1 VARCHAR2 IN
WM_CONCAT 11g 返回clob欄位 ,但是關聯其他表varchar2欄位會報錯,所以需要將WM_CONCAT函式返回來的值輸出varchar2 才可以和其他表關聯。
解決辦法如下:
如下一個系列的函式,可以幫助使用者構建自有的行列轉換函式:(自己可以選擇返回值 clob 、varchar2)
建立type:
create or replace TYPE en_concat_im
AUTHID CURRENT_USER AS OBJECT
(
CURR_STR VARCHAR2(32767),
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT en_concat_im) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT en_concat_im,
P1 IN VARCHAR2) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN en_concat_im,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT en_concat_im,
SCTX2 IN en_concat_im) RETURN NUMBER
);
建立包體:
create or replace TYPE BODY en_concat_im
IS
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT en_concat_im)
RETURN NUMBER
IS
BEGIN
SCTX := en_concat_im(NULL) ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT en_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 en_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 en_concat_im,
SCTX2 IN en_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 en_concat(P1 VARCHAR2) RETURN VARCHAR2 AGGREGATE USING en_concat_im ;
檢視:
select en_concat((result)=>username) username from dba_users;
username
——————————————————————————————
SYS;SYSTEM;SCOTT;REPORT;OUTLN;MGMT_VIEW;FLOWS_FILES;MDSYS;ORDSY
select en_concat(P1 => username) from dba_users;
username
——————————————————————————————
SYS;SYSTEM;SCOTT;REPORT;OUTLN;MGMT_VIEW;FLOWS_FILES;MDSYS;ORDSY
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30345407/viewspace-2121547/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL GROUP_CONCAT函式 將多行資料合併成一行MySql函式
- 用explode函式把json中用一層級資料一行轉換多行函式JSON
- 多行資料放到一行上
- 函式的合成與柯里化函式
- Android Textview 一行居中 兩行居左AndroidTextView
- 用一行Python進行資料收集探索Python
- 隔兩行生一行計算變化率
- ton函式函式hash的兩種形式函式
- 利用Oracle分析函式row_number和sys_connect_by_path實現多行資料合併為一行Oracle函式
- css兩個div在同一行排列CSS
- 隔兩行生一行計算變化率(續)
- c++ 執行緒函式傳遞資料 namespaceC++執行緒函式namespace
- Excel 快速合併多行資料為一行Excel
- Mysql查詢一行資料超時分析MySql
- DBeaver如何刪除一行或多行資料
- 一行程式碼,Pandas秒變分散式,快速處理TB級資料行程分散式
- INFORMIX資料庫函式ORM資料庫函式
- SQL刪除重複資料,只保留一行SQL
- 查欄位指定資料後一行記錄
- KETTLE一行一行執行方法
- 7.資料庫函式資料庫函式
- oracle資料庫常用分析函式與聚合函式的用法Oracle資料庫函式
- 常見函式之單行函式函式
- 使用SQLLOADER將一行資料拆分為多行進行載入SQL
- 轉:SQL Server中將多行資料拼接為一行資料(一個字串)SQLServer字串
- 大資料採集:fillna函式大資料函式
- MongoDB之資料更新(更新函式)MongoDB函式
- 【資料庫之函式依賴】資料庫函式
- 提升逼格的兩個函式函式
- JavaScript 函式的兩種宣告方式JavaScript函式
- 深入理解 函式、匿名函式、自執行匿名函式函式
- Sql Server函式全解(3):資料型別轉換函式和文字影象函式SQLServer函式資料型別
- Sql Server函式全解(三)資料型別轉換函式和文字影像函式SQLServer函式資料型別
- Django中views資料查詢使用locals()函式進行優化DjangoView函式優化
- c++ 執行緒函式傳遞資料 物件和變數C++執行緒函式物件變數
- js獲取表格第一行資料(不包括表頭)JS
- 讀取每一行檔案資料的方法bufferedreader
- 教你兩種資料庫覆蓋式資料匯入方法資料庫