Sql oracle wmconcat,listagg函数报告字符串长度超过4000字节错误
由于这个问题,我们的web项目已经崩溃了好几次。大多数在线答案建议使用xmlagg或clob,但仍然太麻烦了。Sql oracle wmconcat,listagg函数报告字符串长度超过4000字节错误,sql,database,oracle,Sql,Database,Oracle,由于这个问题,我们的web项目已经崩溃了好几次。大多数在线答案建议使用xmlagg或clob,但仍然太麻烦了。 那么,我如何重写像wmconcat或listagg这样只显示前几个单词的函数呢?为了避免这个问题,其余的单词将被省略号替换?另一种方法是在长度接近4000个字符时跳过连接 首先,您需要按照特定顺序查找要追加的列的长度的运行总和。在最后一个字符串中不包括逗号的字符达到接近3500个字符之前,找到按该顺序可以追加的最大行数 接下来,使用listag以相同的顺序连接字符串,限制在第一步中找到
那么,我如何重写像wmconcat或listagg这样只显示前几个单词的函数呢?为了避免这个问题,其余的单词将被省略号替换?另一种方法是在长度接近4000个字符时跳过连接 首先,您需要按照特定顺序查找要追加的列的长度的运行总和。在最后一个字符串中不包括逗号的字符达到接近3500个字符之前,找到按该顺序可以追加的最大行数 接下来,使用listag以相同的顺序连接字符串,限制在第一步中找到的行数
WITH cte(maxrows)
AS (SELECT Max(rn)
FROM (SELECT row_number()
over (
ORDER BY rcol ) rn,
SUM(Length(rcol))
over (
ORDER BY rcol) total_length
FROM yourtable)
WHERE total_length < 3500),
ltd AS (SELECT *
FROM (SELECT rcol,
maxrows,
row_number()
over (
ORDER BY rcol ) rn
FROM yourtable
cross join cte)
WHERE rn <= maxrows)
SELECT LISTAGG(rcol, ',')
within GROUP ( ORDER BY rcol ) less_than_4000
FROM ltd;
注意:如果列中有重复条目,建议在开始上述处理之前使用不同的集合,假设串联中的一条记录不需要多个值。我们的项目已基本完成,可以部署使用。我项目中的一些查询非常复杂,我无法将您的方法应用到查询中。是否可以编写一个与wmconcat类似的函数,以便我可以简单地替换“wmconcat”使用我编写的函数。SELECT CAST RTRIM EXTRACTXMLAGXMLELEMENTC,x.cust_id | | |',“ORDER BY 1,/c/text.getclobval,”,“AS VARCHAR24000 AS f3_list FROM SELECT*FROM acrm_f_ci_customer,其中rownum介于1和4000之间x GROUP BY 1XMLAGG似乎不起作用,它还将报告“字符串太长”错误。@abracadabra您可以创建一个返回CLOB的函数。它的性能不如Listag,但它可以工作。你会在网上找到许多实现。