ORA-01489: результат объединения строк слишком длинный 01489. 00000 - результат объединения строк слишком длинный

У меня есть этот запрос, но я получил ошибку ORA-01489: ORA-01489: результат объединения строк слишком длинный 01489. 00000 - "результат объединения строк слишком длинный". Возможно ли решить эту проблему, установив системную переменную?

SELECT "USER_PRIMARY_sector","LOGIN","FIRST_NAME","LAST_NAME","sector_ROLE"
FROM (
SELECT user_primary_sector,login, first_name,  last_name,
       LTRIM(MAX(SYS_CONNECT_BY_PATH(rights,' / '))
       KEEP (DENSE_RANK LAST ORDER BY curr),' / ') AS sector_ROLE
      FROM  
        (SELECT  login,
              first_name,  
              last_name,
              user_primary_sector,
              rights,
              ROW_NUMBER() OVER (PARTITION BY login ORDER BY rights) AS curr,
              ROW_NUMBER() OVER (PARTITION BY login ORDER BY rights) -1 AS prev
        FROM  (select   member0_.login,  member0_.first_name first_name, sector2.sector_name user_primary_sector,  member0_.last_name last_name,
                        CONCAT(CONCAT(sector.sector_name, ' - '), role3_.role_name) rights 
 from
  TLC_DEVICES.t_member member0_
 inner join  TLC_DEVICES.t_user member0_1_    on member0_.member_id=member0_1_.user_id
 inner join  TLC_DEVICES.t_playable_role playedrole1_    on member0_.member_id=playedrole1_.user_id
 inner join  TLC_DEVICES.t_sector_role sectorrole2_    on playedrole1_.sector_role_id=sectorrole2_.sector_role_id
 inner join  TLC_DEVICES.t_role role3_    on sectorrole2_.role_id=role3_.role_id
 inner join  TLC_DEVICES.t_sector sector    on sectorrole2_.sector_id=sector.sector_id
 inner join  TLC_DEVICES.t_sector sector2    on sector2.sector_id=member0_1_.primary_sector_id
 where    current_date between playedrole1_.start_date and playedrole1_.end_date
 order by sector.sector_name
  ))
GROUP BY login, first_name,  last_name, user_primary_sector
CONNECT BY prev = PRIOR curr AND login = PRIOR login
START WITH curr = 1
)
ORDER BY user_PRIMARY_sector, FIRST_NAME, LAST_NAME;

person Nunyet de Can Calçada    schedule 17.02.2016    source источник
comment
Это поможет нам помочь вам, если вы удалите биты вашего сложного запроса, пока он не по-прежнему будет выдавать ошибку в своей простейшей форме.   -  person Chris Pickford    schedule 17.02.2016
comment
Вы действительно используете 11g или используете 12c или более позднюю версию?   -  person Tim Biegeleisen    schedule 17.02.2016
comment
Я на самом деле использую 12c   -  person Nunyet de Can Calçada    schedule 17.02.2016


Ответы (1)


Один из вариантов — установить для системной переменной MAX_STRING_SIZE значение EXTENDED. Из документации Oracle:

Строка символов переменной длины, имеющая максимальную длину в байтах или символах. Вы должны указать размер для VARCHAR2. Минимальный размер 1 байт или 1 символ. Максимальный размер:

32767 байтов или символов, если MAX_STRING_SIZE = EXTENDED
4000 байтов или символов, если MAX_STRING_SIZE = STANDARD

Поэтому, если ваш MAX_STRING_SIZE в настоящее время установлен на STANDARD, вы получите ошибку ORA-01489, если ваша объединенная строка превышает 4000 байтов или символов. Вот как вы можете внести изменения:

ALTER SYSTEM SET MAX_STRING_SIZE = EXTENDED;

Если ваш MAX_STRING_SIZE уже установлен на EXTENDED, вам придется найти другой способ справиться с такими длинными строками.

person Tim Biegeleisen    schedule 17.02.2016
comment
Это возможно только в 12c, пока OP находится на 11g. для любого приложения это не очень хороший дизайн, если агрегация строк превышает этот предел на уровне базы данных. Приложение использует тип данных CLOB для таких огромных требований к хранилищу. - person Lalit Kumar B; 17.02.2016
comment
@LalitKumarB Он отметил это правильно, что либо означает, что он использует 11g и не проверял его, либо на самом деле использует 12c. Я удалю, если он вернется. - person Tim Biegeleisen; 17.02.2016