我在脚本中使用listagg

listagg(' |' || aktiv.AKTIVITÄT_NR || ' |' || aktiv.AKTIVITÄT_KÜRZEL  || ' |' || aktiv.AKTIVITÄT_BESCHREIBUNG || ' |' || aktiv.AKTIVITÄT_ERWARTETES_ERGEBNIS|| ' |' ||  CHR(10)) within group (order by aktiv.AKTIVITÄT_NR)) as activity


当listagg超过4000字节时,所有脚本都会失败。如何处理异常并为此记录插入e.x。 NULL并毫无疑问地转到下一条记录。

最佳答案

抱歉,我使用自己的示例来说明这一点,因为我只是没有德国布局,也没有表格:

with src as (/* overflow */
             select 1 id, level lv
             from dual
             connect by level <= 10000
             union all
             /* fitting */
             select 2, level lv
             from dual
             connect by level <= 10
             union all
             select 3, level lv
             from dual
             connect by level <= 5)
select listagg(case when length_ <= 4000 then lv end,',') within group (order by lv)
from (select id,lv,sum(length(lv) + 1) over (partition by id) - 1 length_ from src)
group by id


这个想法:


src是您的表格,id是您要分组的值,level是您的值
此子查询select id,lv,sum(length(lv) + 1) over (partition by id) - 1 length_ from src收集将来结果listagg的长度,为分隔符+ 1创建了',',为未使用的最后一个分隔符创建了- 1
表达式listagg(case when length_ <= 4000 then lv end,',') within group (order by lv)检查长度是否小于允许值(4000),如果溢出则返回null


我希望这能解决您的问题。

关于sql - 如何处理listagg()函数中的异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20704081/

10-10 14:45