10

我有一个查询,它使用该listagg函数将所有行作为逗号分隔的字符串最终发送到一个大文本框。我收到以下异常:

ORA-01489: result of string concatenation is too long

我知道问题是正在运行以聚合数据的查询返回的行太多,以至于listagg正在执行的字符串连接违反了 4000 个字符的限制。但是,对于我的用例,截断到前 4000 个字符是完全可以接受的。

我将如何从此处修改此示例查询以将“值”列限制为最多 4000 个字符?

SELECT LISTAGG(product_name, ', ') WITHIN GROUP( ORDER BY product_name DESC) "Product_Listing" FROM products

你不能substr绕过调用listagg' becauselistagg throws the exception beforesubstr` 被调用过。

我在 SO 上看到了很多关于如何绕过 4000 个字符限制但不限制结果值的问题。

4

1 回答 1

25

12.2 及以上

ON OVERFLOW选项使得处理 4000 多个字符很容易:

select listagg(product_name, ',' on overflow truncate) within group (order by product_name)
from products;

11.2 至 12.1

解析函数可以生成字符串聚合的运行总长度。然后内联视图可以删除长度大于 4000 的任何值。

在实际查询中,您可能需要将 a 添加partition by到分析函数中,以便仅对某些组进行计数。

--The first 4000 characters of PRODUCT_NAME.
select
    --Save a little space for a ' ...' to imply that there is more data not shown.
    case when max(total_length) > 3996 then
        listagg(product_name, ', ') within group (order by product_name)||
            ' ...'
    else
        listagg(product_name, ', ') within group (order by product_name)
    end product_names
from
(
    --Get names and count lengths.
    select
        product_name,
        --Add 2 for delimiters.
        sum(length(product_name) + 2) over (order by product_name) running_length,
        sum(length(product_name) + 2) over () total_length
    from products
    order by product_name
)
where running_length <= 3996

这是一个演示查询的SQL Fiddle 。

于 2015-02-04T03:25:21.557 回答