Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql oracle wmconcat,listagg函数报告字符串长度超过4000字节错误_Sql_Database_Oracle - Fatal编程技术网

Sql oracle wmconcat,listagg函数报告字符串长度超过4000字节错误

Sql oracle wmconcat,listagg函数报告字符串长度超过4000字节错误,sql,database,oracle,Sql,Database,Oracle,由于这个问题,我们的web项目已经崩溃了好几次。大多数在线答案建议使用xmlagg或clob,但仍然太麻烦了。 那么,我如何重写像wmconcat或listagg这样只显示前几个单词的函数呢?为了避免这个问题,其余的单词将被省略号替换?另一种方法是在长度接近4000个字符时跳过连接 首先,您需要按照特定顺序查找要追加的列的长度的运行总和。在最后一个字符串中不包括逗号的字符达到接近3500个字符之前,找到按该顺序可以追加的最大行数 接下来,使用listag以相同的顺序连接字符串,限制在第一步中找到

由于这个问题,我们的web项目已经崩溃了好几次。大多数在线答案建议使用xmlagg或clob,但仍然太麻烦了。
那么,我如何重写像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,但它可以工作。你会在网上找到许多实现。