Может кто-нибудь посоветовать, что делать, если использование listagg приводит к переполнению varchar2 из-за большого количества агрегированных строк (во время агрегации в SQL-запросе через группу и т. Д.) В одном поле?
Я использую отчет (это всего лишь ОДИН SQL-запрос), в котором я агрегирую телефонные коды по ZoneName (Страна и т. Д.), И у некоторых из них есть тонны кодов для одной зоны - так что я могу получить ошибку "oveflow", потому что 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 или во время печати). В базе данных все данные нормализованы.