Может ли кто-нибудь посоветовать, что делать, когда использование listagg приводит к переполнению varchar2 из-за большого количества агрегированных строк (во время агрегирования в SQL-запросе через группу и т. д.) в одном поле?
Я использую отчет (это всего лишь ОДИН SQL-запрос), где я агрегирую телефонные коды по ZoneName (страна и т. д.), и некоторые из них имеют множество кодов для одной зоны, поэтому я могу получить ошибку «переполнения», вызывающую listagg с использованием varchar2, которые имеют ограничение 32767 .
Так что же делать в таких ситуациях? Переписать запрос и использовать курсоры? Есть ли обходной путь, чтобы обнаружить "переполнение" и разбить, например, такое "БОЛЬШОЕ ПОЛЕ" на ДВЕ строки, чтобы в каждой хватило места для "БОЛЬШОГО списка кодов"???
Поскольку сейчас я на 10gR2, я использую технику «Tab to string» от Tom Kyte. он использует тип:
CREATE OR REPLACE TYPE t_varchar2_tab AS TABLE OF VARCHAR2(32767);
И proc, который преобразует из таблицы Varchar2 в одну строку с ограничением в 32767 символов.
CREATE OR REPLACE FUNCTION tab_to_string (p_varchar2_tab IN t_varchar2_tab,
p_delimiter IN VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS
l_string VARCHAR2(32767);
BEGIN
FOR i IN p_varchar2_tab.FIRST .. p_varchar2_tab.LAST LOOP
IF i != p_varchar2_tab.FIRST THEN
l_string := l_string || p_delimiter;
END IF;
l_string := l_string || p_varchar2_tab(i);
END LOOP;
RETURN l_string;
END tab_to_string;
/
И на данный момент я получил ошибку «переполнение» в моем случае.
Я полагаю, что у listagg proc будет такая же проблема из-за использования Varchar2.
Любые советы?
UPD: Мне это нужно ТОЛЬКО (агрегация кодов в одном поле при формировании отчета) для ВЫВОДА данных для отчета (в .pdf или при печати). В базе данных все данные нормализованы.