2016-03-09 3 views
0

Есть ли какая-то функция, которая делает одно и то же поведение SYS.STRAGG в оракуле, но вместо того, чтобы возвращать VARCHAR (и ограничивается размером VARCHAR), он возвращает CLOB и, таким образом, позволяет (практически) бесконечное количество конкатенированных строк?STRAGG для CLOB?

, например, у меня есть запрос, который возвращает select x from y where z 2.5M запись, и я хочу, чтобы вернуть все эти записи объединяются вместе 1 выстрелило

+0

Всегда указывайте свою ** версию базы данных ** до четырех знаков после запятой. –

+2

Возможный дубликат функции [LISTAGG: «результат конкатенации строки слишком длинный»] (http://stackoverflow.com/q/13795220/266304)? 'stragg' недокументирован, поэтому вы должны использовать' listagg' в любом случае, для более коротких значений. –

ответ

1

функцию XML можно использовать для такого объединения, но и для 2.5M записей будет очень медленный.

Пример:

SELECT 
    rtrim(
     dbms_xmlgen.convert(
      extract(
       xmlroot(
        xmlelement(
         "x", 
         xmlagg(sys_xmlgen(object_name || ', ')) 
        ), 
       version '1.0'), 
      '/x/ROW/text()').getclobval(), 
     1), 
    ', ') aggregated_data 
FROM 
    all_objects 

Вы могли бы рассмотреть возможность использования LISTAGG для предварительной агрегации малых групп строк в типа VARCHAR меньше 4000/32767 байт, а затем использовать агрегацию XML для конечного результата.