2013-04-16 2 views
5

Есть много подобных вопросов по этому вопросу, но я не могу найти никаких решений, которые учитывают все, что имеет слишком большой результат для varchar2.Объединить строки в CLOB

Так что я пытаюсь сделать, это изменить:

Column1 | Column2 
-------- -------- 
1   Hello 
1   world, 
1   please help 
2   Thanks 
2   world, 
2   you're the best. 

В это:

Column1 | Column2 
-------- -------- 
1   Hello world, please help 
2   Thanks world, you're the best. 

Моя конкретная проблема в том, что есть несколько случаев, когда новое сцепленное значение превышает 4000 поэтому я не могу использовать LISTAGG, как я надеялся. Меня особенно интересуют решения, не требующие написать функцию, но и сделают это.

+2

Вы видели это http://stackoverflow.com/questions/9412512/ альтернативный-в-listagg-in-oracle? –

+0

Результаты LISTAGG ограничены максимальным размером VARCHAR2 в SQL (то есть 4000). Для больших строк нам нужно будет использовать альтернативные способы сбора элементов (например, коллекции или пользовательской функции PL/SQL). –

ответ

0

Проверить LISTAGG WITH CLOB? STRING AGGREGATION EXCEEDING 4000 CHARACTERS WITH XMLAGG. Это немного странно, но, похоже, работает.

Bye Хольгер

+0

Немного объяснения ожидается. – Sankumarsingh

+3

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – Arpit

+1

@Arpit - Как это произошло сейчас! – happybuddha

2

Как de.hh.holger уже отмечалось, LISTAGG WITH CLOB? STRING AGGREGATION EXCEEDING 4000 CHARACTERS WITH XMLAGG действительно решить эту проблему.

я разработал немного дальше по этому вопросу, и это должно сделать трюк в случае очень длинной строки сообщения:

SELECT 
    table_row_id, 
    DBMS_XMLGEN.CONVERT (
    EXTRACT(
     xmltype('<?xml version="1.0"?><document>' || 
       XMLAGG(
       XMLTYPE('<V>' || DBMS_XMLGEN.CONVERT(data_value)|| '</V>') 
       order by myOrder).getclobval() || '</document>'), 
       '/document/V/text()').getclobval(),1) AS data_value 
FROM (
    SELECT 1 myOrder, 1 table_row_id,'abcdefg>' data_value FROM dual 
    UNION ALL 
    SELECT 2, 1 table_row_id,'hijklmn' data_value FROM dual 
    UNION ALL 
    SELECT 3, 1 table_row_id,'opqrst' data_value FROM dual 
    UNION ALL 
    SELECT 4, 1 table_row_id,'uvwxyz' data_value FROM dual) 
GROUP BY 
    table_row_id 
Смежные вопросы