Cделать в скрипте проверку на переполнение LISTAGG

Всем привет. В общем суть вопроса в заголовке. Написал такой скрипт. нужно чтобы LISTAGG не падал если собираешь больше 4000к.

    SELECT
    status,
        CASE WHEN sum(LENGTH(ITEM_ID || '' || chr(20) ))<4000 THEN LISTAGG(ITEM_ID || '' || chr(20))
            ELSE 'Превышено максимальное значение' 
        END operation_id
FROM
    (
    SELECT
        CASE
            WHEN ITEM_ID IS NULL
            OR EXISTS(
            SELECT
                1
            FROM
                SUUZPD_EXT.CONFIG_PARAMETER
            WHERE
                ATTR_NAME = 'IGIMAINTENANCE'
                AND ATTR_VALUE = 'true' ) THEN 0
            ELSE 1
        END AS status,
        CASE
            WHEN ITEM_ID IS NULL THEN 0
            ELSE ITEM_ID
        END AS ITEM_ID
    FROM
        dual
    LEFT JOIN (
        SELECT
            DISTINCT ITEM_ID AS ITEM_ID
        FROM
            SUUZPD_EXT.VW_OPERATION_DETAILS
        WHERE
            OPERATION_START_DATE >= SYSDATE - 72 / 24
            AND OPERATION_STATUS = '[1] APPLIED'
            AND ITEM_STATUS IN ('SUCCESS')) ON
        1 = 1 )
GROUP BY
    status

Но всё равно выдаёт такую ошибку: Длина результата операции "LISTAGG" больше, чем "4000". Как исправить CASE, чтобы LISTAGG не переполнялся? Спасибо.


Ответы (1 шт):

Автор решения: Alex R.

У меня под рукой только Oracle, поэтому LISTAGG соответсвующий.

Из вашего запроса лучше создать представление и вставить в запрос ниже или, при наличии возможности, использовать конструкцию WITH

select
 o.owner,
 sum(length(o.object_name || ', ')) len,
 nvl(listagg(decode(d.nn, 1, o.object_name, 2, null), ', ') within group (order by o.object_name), 'Превышено максимальное значение') res
from (select 1 nn from dual union all select 2 from dual) d,
     all_objects o
where exists
  (select
     null
   from all_objects o1
   where d.nn = 1
   and   o1.owner = o.owner
   having sum(length(o1.object_name || ', ')) <= 4000)
or  exists
  (select
     null
   from all_objects o2
   where d.nn = 2
   and   o2.owner = o.owner
   having sum(length(o2.object_name || ', ')) > 4000)
group by o.owner, d.nn

owner это status, object_name это item_id

→ Ссылка