Oracle單個字段多記錄拼接方式
更新時間:2024年07月03日 09:47:24 作者:dongdong咚咚咚
這篇文章主要介紹了Oracle單個字段多記錄拼接方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
1.sql提供以下兩種查詢方式
來拼接同一個字段多個記錄結(jié)果
1.replace+wm_concat 2.listagg within group
兩種方式可實現(xiàn)一樣的效果。

快速腳本:替換 表名 與 字段名 執(zhí)行即可驗證。
select ( -- 1.replace+wm_concat select replace(wm_concat(a.name),',','|') from teacher_leader a ) res1, -- 2.listagg within group ( select listagg(a.name,'|') within group (order by a.name) from teacher_leader a ) res2 from dual;
實測:

2.如果報錯
ORA-00904: “WM_CONCAT”: 標識符無效
可進行如下處理解決,定義type部分參考這篇文章
注意: 如果你沒有system用戶,可能是一個用戶擁有多個角色,那么上面的參考博客對你不適用。
可用下面的方案:
2.1作為SYSDBA角色登錄

2.2 給普通用戶授權
GRANT create type to shop; GRANT create procedure to shop;
登錄shop(以普通用戶normal的身份登錄)

2.3 創(chuàng)建type并創(chuàng)建函數(shù)【wm_concat】
--在shop用戶作為normal角色會話下創(chuàng)建可用的wm_concat函數(shù),直接執(zhí)行以下語句 --定義類型 CREATE OR REPLACE TYPE WM_CONCAT_IMPL AS OBJECT ( CURR_STR VARCHAR2(32767), STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER, MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL, P1 IN VARCHAR2) RETURN NUMBER, MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBER) RETURN NUMBER, MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL, SCTX2 IN WM_CONCAT_IMPL) RETURN NUMBER ); / --定義類型body: CREATE OR REPLACE TYPE BODY WM_CONCAT_IMPL IS STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER IS BEGIN SCTX := WM_CONCAT_IMPL(NULL) ; RETURN ODCICONST.SUCCESS; END; MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL, 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 WM_CONCAT_IMPL, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBER) RETURN NUMBER IS BEGIN RETURNVALUE := CURR_STR ; RETURN ODCICONST.SUCCESS; END; MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL, SCTX2 IN WM_CONCAT_IMPL) 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; / --自定義行變列函數(shù): CREATE OR REPLACE FUNCTION wm_concat(P1 VARCHAR2) RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ; /
2.4 最后一步,創(chuàng)建同義詞及授權
--創(chuàng)建完成,給其創(chuàng)建同義詞及授權,以供其他用戶能正常使用。 create public synonym WM_CONCAT_IMPL for shop.WM_CONCAT_IMPL / create public synonym wm_concat for shop.wm_concat / grant execute on WM_CONCAT_IMPL to public / grant execute on wm_concat to public /
驗證

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Oracle數(shù)據(jù)庫自定義類型type的用法詳解
這篇文章主要介紹了Oracle數(shù)據(jù)庫自定義類型type的用法詳解,Oracle?數(shù)據(jù)庫的概念和其它數(shù)據(jù)庫不一樣,這里的數(shù)據(jù)庫是一個操作系統(tǒng)只有一個庫,可以看作是?Oracle?就只有一個大數(shù)據(jù)庫,需要的朋友可以參考下2023-07-07
在oracle 數(shù)據(jù)庫中查看一個sql語句的執(zhí)行時間和SP2-0027錯誤
oracle 數(shù)據(jù)庫中查看一個sql語句的執(zhí)行時間和SP2-0027錯誤的解決方法2009-10-10

