использование listagg при переполнении varchar2 - что делать? - PullRequest
1 голос
/ 11 ноября 2009

Может кто-нибудь посоветовать, что делать, если использование 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 или во время печати). В базе данных все данные нормализованы.

1 Ответ

0 голосов
/ 11 ноября 2009

Лучшим способом было бы нормализовать данные так, чтобы каждая строка имела отдельную строку, тогда количество элементов, которые вы можете иметь, ограничено базой данных, а не одним полем.

tab_to_string полезна только для вывода, и я сомневаюсь, что вы хотите видеть поле> 32K символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...