问题描述
在使用listagg函数做列转行操作时(或者叫行合并)如果合并后的值超过varchar2的最大值4000就会报错。
oracle版本:12c
问题重现
--使用这个sql查询返回值为:1,2,3,4,5,6,7,8,9
select listagg(id, ',') within group (order by id)
from (
select level as id from dual connect by level < 10
)
--但如果将level改成2000就会报错:ORA-01489: 字符串连接的结果过长
select listagg(id, ',') within group (order by id)
from (
select level as id from dual connect by level < 2000
)
解决方法
使用xmlagg函数代替listagg
select rtrim(xmlagg(xmlelement(e,id,',').extract('//text()') order by id).GetClobVal(),',')
from (
select level as id from dual connect by level < 2000
)