Oracle單個(gè)字段多記錄拼接方式
1.sql提供以下兩種查詢方式
來拼接同一個(gè)字段多個(gè)記錄結(jié)果
1.replace+wm_concat 2.listagg within group
兩種方式可實(shí)現(xiàn)一樣的效果。

快速腳本:替換 表名 與 字段名 執(zhí)行即可驗(yàn)證。
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;
實(shí)測(cè):

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

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

2.3 創(chuàng)建type并創(chuàng)建函數(shù)【wm_concat】
--在shop用戶作為normal角色會(huì)話下創(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)建同義詞及授權(quán)
--創(chuàng)建完成,給其創(chuàng)建同義詞及授權(quán),以供其他用戶能正常使用。 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 /
驗(yàn)證

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Oracle往某表批量插入記錄的幾種實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Oracle往某表批量插入記錄的幾種實(shí)現(xiàn)方法,Oracle批量插入語句與其他數(shù)據(jù)庫不同,文中通過代碼實(shí)例介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
Oracle計(jì)算時(shí)間差為毫秒的實(shí)現(xiàn)代碼
這里我是用分隔字符串單獨(dú)計(jì)算毫秒部分,如果有更好的辦法,請(qǐng)大家分享一下,下面是查詢時(shí)間差為毫秒的模板,需要的朋友可以參考下2017-03-03
Oracle數(shù)據(jù)庫自定義類型type的用法詳解
這篇文章主要介紹了Oracle數(shù)據(jù)庫自定義類型type的用法詳解,Oracle?數(shù)據(jù)庫的概念和其它數(shù)據(jù)庫不一樣,這里的數(shù)據(jù)庫是一個(gè)操作系統(tǒng)只有一個(gè)庫,可以看作是?Oracle?就只有一個(gè)大數(shù)據(jù)庫,需要的朋友可以參考下2023-07-07
在oracle 數(shù)據(jù)庫中查看一個(gè)sql語句的執(zhí)行時(shí)間和SP2-0027錯(cuò)誤
oracle 數(shù)據(jù)庫中查看一個(gè)sql語句的執(zhí)行時(shí)間和SP2-0027錯(cuò)誤的解決方法2009-10-10
Oracle存儲(chǔ)過程與函數(shù)的詳細(xì)使用教程
存儲(chǔ)過程和函數(shù)在Oracle中被稱為子程序,是指被命名的PL/SQL塊,這種塊可以帶有參數(shù),可以被多次調(diào)用,下面這篇文章主要給大家介紹了關(guān)于Oracle存儲(chǔ)過程與函數(shù)的詳細(xì)使用,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07

