जैसा कि अन्य टिप्पणीकारों ने पहले ही कहा है, Oracle 12.2 तक ऐसी त्रुटि से बचने का कोई तरीका नहीं है (जहां List_agg का नया विकल्प "ON OVERFLOW TRUNCATE") है।
ऑरैकल के पिछले संस्करणों में, यदि आप 4000 बाइट्स से अधिक समय तक स्ट्रिंग्स को जोड़ते हैं, तो आपको वह त्रुटि मिलती है। आपके पास इसे रोकने का कोई उपाय नहीं है।
यदि आपको अभी भी पिछले संस्करणों में ऐसा करने की आवश्यकता है, तो आपको इसे करने के लिए अपना स्वयं का कार्य लिखना होगा और आपको तदनुसार अपनी क्वेरी को संशोधित करने की आवश्यकता होगी:
यह कस्टम फ़ंक्शन आपकी समस्या का समाधान कर सकता है
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;
/
इसका उपयोग करने के लिए आपको CAST/COLLECT ऑपरेटर का उपयोग करना होगा।
यह एक उपयोग उदाहरण है:
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