listagg 字符串連接的結果過長問題解決

因爲業務需要對一些數據進行統計,需要對錶涉及到的不同部門的進行過任務的用戶id進行拼接之後到java代碼中進行去重計數。

開始準備使用WM_CONCAT,放進去之後發現提示沒有這個函數。

查了一下原來是因爲這個函數依賴WMSYS用戶,這個版本並沒有配置,無奈只能退而求其次選擇了listagg函數。

一輪下來效果不錯,想要的效果可以實現。

SELECT
	r.department_id law_dept_id,
	(
		SELECT
			listagg (
				rt.extracted_person_ids,
				','
			) WITHIN GROUP (
				ORDER BY
 					rt.extracted_person_ids
			)
			
		FROM
			RANDOM_TASK rt,
			SYS_DEPARTMENT sd
		WHERE
			rt.CREAT_DEPARTMENT_ID = sd.DEPARTMENT_ID
		AND sd.DEPARTMENT_NUMBER LIKE CONCAT (r.department_num, '%')
		AND rt.distributed_state = 1
		AND rt.STATE = 1
		AND rt.LAUNCH_DATE BETWEEN TO_DATE ('2017-07-05', 'yyyy-mm-dd')
		AND (TO_DATE('2017-07-05', 'yyyy-mm-dd') + 1)
	) law_user_str
FROM
	random_user_count r
ORDER BY
	r.area_code,
	r.department_num;

可是某一天,這段sql在運行的時候突然報錯,提示“字符串連接的結果過長”,網上查詢之後才知道,原來用listagg進行拼接,返回的結果是varchar類型,而且有最大長度限制,可以轉成club或者截取。。。

後來根據各種鏈接,找到一個相對靠譜的回答,點擊打開鏈接

改了之後的sql如下:

SELECT
	r.department_id law_dept_id,
	(
		SELECT
-- 			listagg (
-- 				rt.extracted_person_ids,
-- 				','
-- 			) WITHIN GROUP (
-- 				ORDER BY
--  					rt.extracted_person_ids
-- 			)
			xmlagg(xmlparse(content rt.extracted_person_ids||',' wellformed) order by rt.extracted_person_ids).getclobval()
		FROM
			RANDOM_TASK rt,
			SYS_DEPARTMENT sd
		WHERE
			rt.CREAT_DEPARTMENT_ID = sd.DEPARTMENT_ID
		AND sd.DEPARTMENT_NUMBER LIKE CONCAT (r.department_num, '%')
		AND rt.distributed_state = 1
		AND rt.STATE = 1
		AND rt.LAUNCH_DATE BETWEEN TO_DATE ('2017-07-05', 'yyyy-mm-dd')
		AND (TO_DATE('2017-07-05', 'yyyy-mm-dd') + 1)
	) law_user_str
FROM
	random_user_count r
ORDER BY
	r.area_code,
	r.department_num;


解決問題,結果正常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章