Jak již řekli jiní komentátoři, neexistuje způsob, jak se takové chybě vyhnout, dokud Oracle 12.2 (kde List_agg má novou možnost "ON OVERFLOW TRUNCATE").
Pokud v předchozích verzích oracle zřetězíte řetězce delší než 4000 bajtů, dostanete tuto chybu. nemáte ŽÁDNÝ způsob, jak tomu zabránit.
Pokud to stále potřebujete udělat v předchozích verzích, musíte si pro to napsat vlastní funkci a musíte odpovídajícím způsobem upravit svůj dotaz:
Tato vlastní funkce může vyřešit váš problém
create or replace type TAB_STRINGS is table of varchar2(4000)
/
create or replace function My_list_agg(strings in TAB_STRINGS,
separator in varchar2,
max_len integer) return varchar2 deterministic is
result varchar2(32000);
tmp varchar2(32000);
begin
result := null;
if strings is not null then
for idx in strings.first .. strings. last loop
tmp := strings(idx);
if tmp is not null then
if result is null then
exit when length(tmp) > max_len;
result := tmp;
else
exit when(length(result) + length(separator) + length(tmp)) > max_len;
result := result || separator || tmp;
end if;
end if;
end loop;
end if;
return result;
end;
/
k jeho použití musíte použít operátor CAST/COLLECT.
toto je příklad použití:
select table_name,
My_list_agg(
-- first argument: array of strings to be concatenated
cast ( collect (column_name order by column_name) as TAB_STRINGS),
-- second (optional) argument: the separator
',',
-- third argument (optional): the maximum length of the string to be returned
1000
) as column_list
from user_tab_columns t
group by table_name
order by table_name