2017-12-28 20 views
2

Wenn ein Spaltenwert zu lang ist, gibt Listagg NULL-Ausgabe in Oracle 12c. Was ist die Ursache dafür und was ist die Lösung?LISTAGG in Oracle gibt NULL

SQL> select length(algo_desc) from r2_temp where DECL = '305'; 
    32759 

ALGO_DESC ist sehr lang, wie 1045,2339,2389 ....... 37364,58922,2389392 Nun, wenn ich LISTAGG verwenden dann gibt es NULL wie folgt:

SQL> select dump(listagg(algo_desc, ',') within group (order by algo_desc)) as algo_desc from r2_temp where DECL = '305'; 
    NULL 

maximale Größe der Spalte ALGO_DESC 32767, es erweitert varchar2 in 12c

+1

'l istagg() 'ist auf die Länge von' varchar2() '/' nvarchar2() 'begrenzt, was eher 4000 Zeichen entspricht. –

+0

Ich verwende erweiterte varchar2 Größe, z. B. VARCHAR2 (32767) –

+0

Interessant. Bei einigen langen Werten scheint es beschädigt zu sein, mit einem Dump, der viele Nullen anzeigt (was wie Bug 19461687 aussieht, aber das sollte behoben sein). Und dann manifestiert sich diese Korruption irgendwann als eine allgemeine Null? Zeit, eine Serviceanfrage zu stellen, vielleicht? –

Antwort

0

Als Abhilfe können Sie diese Funktion nutzen zu können:

CREATE OR REPLACE TYPE VARCHAR_TABLE_TYPE AS TABLE OF VARCHAR2(32767); 
-- or  CREATE OR REPLACE TYPE VARCHAR_TABLE_TYPE AS TABLE OF NUMBER; 


CREATE OR REPLACE FUNCTION JoinTable(TAB IN VARCHAR_TABLE_TYPE, Joiner IN VARCHAR2) RETURN CLOB IS 
    res CLOB; 
BEGIN 
    IF TAB IS NULL THEN 
     RETURN NULL; 
    END IF; 
    IF TAB.COUNT = 0 THEN 
     RETURN NULL; 
    END IF; 

    DBMS_LOB.CREATETEMPORARY(res, FALSE, DBMS_LOB.CALL); 
    IF TAB(TAB.FIRST) IS NOT NULL THEN 
     DBMS_LOB.APPEND(res, TAB(TAB.FIRST)); 
    END IF; 
    IF TAB.COUNT > 1 THEN 
     FOR i IN TAB.FIRST+1..TAB.LAST LOOP 
      DBMS_LOB.APPEND(res, Joiner||TAB(i)); 
     END LOOP; 
    END IF; 
    RETURN res; 

END JoinTable; 



select JoinTable(CAST(COLLECT(algo_desc order by algo_desc) AS VARCHAR_TABLE_TYPE), ',') as algo_desc 
from r2_temp 
where DECL = '305'; 
+1

Vielen Dank für Ihre Eingabe. Das geht aber auch nicht, gibt NULL in der Ausgabe. –

Verwandte Themen