Oracle單個字段多記錄拼接方式
1.sql提供以下兩種查詢方式
來拼接同一個字段多個記錄結(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í)測:
2.如果報(bào)錯
ORA-00904: “WM_CONCAT”: 標(biāo)識符無效
可進(jìn)行如下處理解決,定義type部分參考這篇文章
注意: 如果你沒有system用戶,可能是一個用戶擁有多個角色,那么上面的參考博客對你不適用。
可用下面的方案:
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角色會話下創(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é)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Oracle生成隨機(jī)數(shù)字、字符串、日期、驗(yàn)證碼及 UUID的方法
這篇文章主要介紹了Oracle生成隨機(jī)數(shù)字、字符串、日期、驗(yàn)證碼及 UUID的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02Oracle Number型數(shù)值存儲與轉(zhuǎn)換的實(shí)現(xiàn)詳解
本篇文章是對Oracle中Number型數(shù)值存儲與轉(zhuǎn)換的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05oracle在導(dǎo)入數(shù)據(jù)時報(bào)600錯誤的解決方法
最近在工作中進(jìn)行oracle數(shù)據(jù)庫導(dǎo)入的時候遇到了600錯誤,通過查找相關(guān)的資料,最終終于解決了,下面這篇文章主要給大家介紹了關(guān)于oracle在導(dǎo)入數(shù)據(jù)時報(bào)600錯誤的解決方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09oracle不支持的字符集orai18n.jar?ZHS16GBK異常問題解決辦法
字符集是數(shù)據(jù)庫中用來表示和存儲字符的編碼系統(tǒng),這篇文章主要給大家介紹了關(guān)于oracle不支持的字符集orai18n.jar?ZHS16GBK異常問題的解決辦法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02oracle數(shù)據(jù)庫如何給用戶授權(quán)查詢權(quán)限
這篇文章主要給大家介紹了關(guān)于oracle數(shù)據(jù)庫如何給用戶授權(quán)查詢權(quán)限的相關(guān)資料,授予權(quán)限是數(shù)據(jù)庫管理中的重要任務(wù),它可以確保用戶有權(quán)訪問所需的數(shù)據(jù)庫對象,并執(zhí)行必要的操作,需要的朋友可以參考下2024-01-01Oracle客戶端版本及位數(shù)(Windows系統(tǒng))查看方法
這篇文章主要介紹了Windows系統(tǒng)下Oracle客戶端版本及位數(shù)查看方法,感興趣的小伙伴們可以參考一下2016-08-08升級和卸載Oracle數(shù)據(jù)庫軟件的命令整理
這篇文章主要介紹了升級和卸載Oracle數(shù)據(jù)庫軟件的命令整理,包括升級時可能用到的查看版本號和備份操作的命令介紹,需要的朋友可以參考下2015-12-12