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

时间:2017-12-25 07:36:09

标签: sql database oracle

由于这个问题,我们的网络项目已经崩溃了几次。网上的大多数答案建议使用xmlagg或clob,但仍然太麻烦了。 那么如何重写像wmconcat或listagg这样的函数,只显示前几个单词以避免问题,其余的单词将被省略号替换?

1 个答案:

答案 0 :(得分:1)

另一种方法是,一旦长度接近4000个字符,就跳过连接

首先,您需要在特定的ORDER之后找到要追加的列的长度的运行总和。按顺序查找最大行数,在它达到接近3500个字符(不包括最终字符串中的逗号)之前,您可以追加它们。

接下来,使用LISTAGG使用相同的顺序连接字符串,限制在第一步中找到的行数。

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;  

DEMO

注意:如果您在列中有重复的条目,建议您在上述处理开始之前设置DISTINCT,假设您不需要多个连接中记录的值。