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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一行式
- 函式的合成與柯里化函式
- Android Textview 一行居中 兩行居左AndroidTextView
- 用一行Python進行資料收集探索Python
- ton函式函式hash的兩種形式函式
- c++ 執行緒函式傳遞資料 namespaceC++執行緒函式namespace
- 一行程式碼,Pandas秒變分散式,快速處理TB級資料行程分散式
- DBeaver如何刪除一行或多行資料
- Mysql查詢一行資料超時分析MySql
- Excel 快速合併多行資料為一行Excel
- oracle資料庫常用分析函式與聚合函式的用法Oracle資料庫函式
- 常見函式之單行函式函式
- 如何從 SAP Fiori List Report Table 點選事件響應函式里拿到表格某一行的資訊事件函式
- 深入理解 函式、匿名函式、自執行匿名函式函式
- 大資料採集:fillna函式大資料函式
- 提升逼格的兩個函式函式
- c++ 執行緒函式傳遞資料 物件和變數C++執行緒函式物件變數
- 利用Jquery的map函式將json資料行轉化為表格jQuery函式JSON
- Django中views資料查詢使用locals()函式進行優化DjangoView函式優化
- Django筆記二十五之資料庫函式之日期函式Django筆記資料庫函式
- Django筆記二十七之資料庫函式之文字函式Django筆記資料庫函式
- string型別資料的find函式型別函式
- 利用wordpress的資料庫操作函式資料庫函式
- 教你兩種資料庫覆蓋式資料匯入方法資料庫
- python函式每日一講 - exec執行函式Python函式
- 自執行函式函式
- 立即執行函式函式
- 專案啟動,main函式之前的程式碼執行兩次 restartedMainAI函式REST
- MySQL 對window函式執行sum函式疑似BugMySql函式
- vue對table的某一行的資料進行編輯,刪除操作Vue
- 一行一行手敲webpack4配置Web
- Linux 中 如何判斷每一行的資料都是相同的Linux
- CSS 設定元素第一行文字樣式CSS
- 雜湊函式與資料完整性 (^=◕ᴥ◕=^)函式
- MySQL-日期和資料處理函式MySql函式
- 【大資料開發】Hive——Hive函式大全大資料Hive函式
- 資料型別與函式索引-Oracle篇資料型別函式索引Oracle
- 資料型別與函式索引-MySQL篇資料型別函式索引MySql
- 使用SQL以及函式等做資料分析SQL函式