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