2013-04-16 12 views
5

Istnieje wiele podobnych pytań na ten temat, ale nie mogę znaleźć żadnych rozwiązań, które uwzględniają wszystko, czego wynik końcowy nie jest zbyt duży dla varchar2.Łączenie wierszy w CLOB

Więc co próbuję zrobić, to zmienić:

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

Do tego:

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

Moje szczególnym problemem jest to, że istnieje kilka przypadków, w których nowa wartość przekracza 4000 łączonych znaków, więc nie mogę używać LISTAGG, tak jak miałem nadzieję. Jestem szczególnie zainteresowany rozwiązaniami bez konieczności pisania funkcji, ale albo to zrobię.

+2

Widziałeś ten http://stackoverflow.com/questions/9412512/ alternatywa-lista-w-oracle? –

+0

Wyniki LISTAGG są ograniczone do maksymalnego rozmiaru VARCHAR2 w SQL (tj. 4000). W przypadku większych ciągów musimy użyć alternatywnych sposobów zbierania elementów (takich jak kolekcja lub zdefiniowana przez użytkownika funkcja PL/SQL). –

Odpowiedz

0

Sprawdź LISTAGG WITH CLOB? STRING AGGREGATION EXCEEDING 4000 CHARACTERS WITH XMLAGG. To trochę dziwne, ale wydaje się działać.

Bye Holger

+0

Nieco oczekiwane wyjaśnienie. – Sankumarsingh

+3

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. – Arpit

+1

@Arpit - Tak jak to się stało teraz! – happybuddha

2

Jak de.hh.holger już wspomniałem, LISTAGG WITH CLOB? STRING AGGREGATION EXCEEDING 4000 CHARACTERS WITH XMLAGG rzeczywiście rozwiązać ten problem.

Mam opracowane trochę dalej na ten temat i to powinno wystarczyć w przypadku bardzo długiej wiadomości strun:

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 
Powiązane problemy