oracle 使用listagg函数报 ORA-01489: result of string concatenation is too long错误处理

由于oracle 19c不能使用wm_concat函数,只能使用listagg进行列转行。 在使用时遇到如下错误
ORA-01489: result of string concatenation is too long

   SELECT t.tablespace_name,
                   listagg(t.table_name, ',') WITHIN GROUP(ORDER BY table_name) over(PARTITION BY tablespace_name) clause
              FROM user_tables t;

在这里插入图片描述
错误是由于oracle对字符串长度有限制,长度不能超过4000.超过4000以后需要转为clob类型。
解决办法使用oracle的另外一个函数xmlagg。

 SELECT t.tablespace_name,
                       xmlagg(xmlparse(content t.table_name || ',' wellformed) ORDER BY t.table_name).getclobval()
                  FROM user_tables t
                 GROUP BY t.tablespace_name;

查询结果
在这里插入图片描述
看到合并后的内容后面多了一个连接符。所以还可以使用rtrim函数去掉多余的连接符

   SELECT t.tablespace_name,
                       rtrim(xmlagg(xmlparse(content t.table_name || ',' wellformed) ORDER BY t.table_name).getclobval(),
                             ',')
                  FROM user_tables t
                 GROUP BY t.tablespace_name;

增加rtrim函数后,连接内容不再有多余的连接符
在这里插入图片描述

但是使用xmlagg函数将内容转为clob后也会有个缺点,就是clob不能使用聚合函数,也不能进行group by 或者去重后。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜菜的中年程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值