由于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 或者去重后。