Скажем, у меня есть эта таблица:
ID|Col1|Col2|Col3
1|Text that has 4000 chars|Text2 that has 4000 chars|Text3 that has 4000 chars
2|Text4 that has 4000 chars|Text5 that has 4000 chars|Text6 that has 4000 chars
3|Text7 that has 4000 chars|Text8 that has 4000 chars|Text9 that has 4000 chars
Я использую listagg так:
SELECT id,
listagg(col1||col2||col3, ',') within group (order by id)
FROM table;
И я сталкиваюсь с ошибкой:
ORA-01489: result of string concatenation is too long
Проведя исследование, я обнаружил, что с помощью xmlagg можно добиться цели (ссылка), но затем понял, реальная проблема заключается в объединении col1, col2 и col3, поскольку оно ограничено только 4000 символов, поэтому выполнение xmlagg все равно вернет ту же ошибку.
Кто-нибудь уже разобрался с этим? Или нет обходного пути для этого? (ссылка)
Обновлять:
Я обновил примеры значений в таблице просто для ясности (чтобы г-н Кумар понял), и мой ожидаемый результат должен быть примерно таким:
ID | Agg
1 | Text that has 4000 charsText2 that has 4000 charsText3 that has 4000 chars
2 | Text4 that has 4000 charsText5 that has 4000 charsText6 that has 4000 chars
3 | Text7 that has 4000 charsText8 that has 4000 charsText9 that has 4000 chars
Что видимо не работает.
rtrim(xmlagg(xmlelement(e,col1,',').extract('//text()') order by col1).GetClobVal(),',')||rtrim(xmlagg(xmlelement(e,col2,',').extract('//text()') order by col2).GetClobVal(),',')
- person Lalit Kumar B   schedule 02.12.2015SET LONG 2000000 set pagesize 50000 WITH DATA AS ( SELECT rpad('a',4000,'*') col1, rpad('b',4000,'*') col2 FROM dual ) SELECT rtrim(xmlagg(XMLELEMENT(e,col1,',').EXTRACT('//text()')).GetClobVal(),',') || rtrim(xmlagg(XMLELEMENT(e,col2,',').EXTRACT('//text()')).GetClobVal(),',') very_long_text FROM DATA;
col1 и col2 каждый по 4000 байт, в результате конкатенации получается 8000 байт. - person Lalit Kumar B   schedule 02.12.2015