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 使用listagg函数报 ORA-01489: result of string concatenation is too long错误处理_第1张图片
错误是由于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;

查询结果
oracle 使用listagg函数报 ORA-01489: result of string concatenation is too long错误处理_第2张图片
看到合并后的内容后面多了一个连接符。所以还可以使用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函数后,连接内容不再有多余的连接符
oracle 使用listagg函数报 ORA-01489: result of string concatenation is too long错误处理_第3张图片

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

你可能感兴趣的:(oracle,问题处理)