将listagg函数限制为前4000个字符

spo*_*ots 3 sql oracle string-concatenation varchar2 oracle11g

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

ORA-01489: result of string concatenation is too long

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

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

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

你无法substr绕过调用listagg' becauselistagg throws the exception beforesubstr`被调用.

我已经看到很多关于如何绕过4000个字符限制的问题,但不限制结果值.

Jon*_*ler 7

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

在实际查询中,您可能需要向ON OVERFLOW分析函数添加一个,以便仅对某个组进行计数.

select listagg(product_name, ',' on overflow truncate) within group (order by product_name)
from products;
Run Code Online (Sandbox Code Playgroud)

这是一个演示查询的SQL小提琴.