abgeschnittene LISTAGG Zeichenfolge [duplizieren]

9

Ich verwende Oracle 11g R2 und ich muss Strings (VARCHAR2, 300) aus mehreren Zeilen verketten. Ich verwende LISTAGG , was gut funktioniert, bis der verkettete String das Limit erreicht. An diesem Punkt erhalte ich ein ORA-01489: result of string concatenation is too long .

Am Ende möchte ich nur die ersten 4000 Zeichen der verketteten Zeichenfolge. Wie ich dahin komme, ist egal. Ich werde ineffiziente Lösungen akzeptieren.

Hier ist meine Frage:

%Vor%     
Howie 07.09.2012, 09:20
quelle

4 Antworten

3

Sie können entweder die integrierte (aber veraltete) STRAGG-Funktion

verwenden %Vor%

(bitte beachten Sie, dass distinct notwendig zu sein scheint, um Duplikate zu vermeiden)

oder definieren Sie Ihre eigene Aggregationsfunktion / Art:

%Vor%

und benutze es so:

%Vor%

Ich glaube, dass dieser Ansatz ursprünglich von Tom Kyte vorgeschlagen wurde (zumindest, wo ich ihn herbekommen habe - Asktom: StringAgg

    
Frank Schmitt 07.09.2012, 10:35
quelle
4

Dieser Code funktioniert für jede Datenlänge, schnell genug

%Vor%     
Gregory Kneller 26.09.2013 10:15
quelle
1

Vielleicht wird es dir helfen:

%Vor%

BEARBEITEN:

oder versuchen

%Vor%     
Parado 07.09.2012 09:26
quelle
1

Dies ist der Nachteil der LISTAGG-Funktion, sie behandelt nicht die Grenze der Zeichenkette, die aufgrund der analytischen Funktion von LISTAGG erzeugt wird. Dafür müssen Sie die kumulative Summe der Länge nehmen und basierend darauf müssen Sie begrenzen.

%Vor%

Aber das wird nicht das perfekte Ergebnis ergeben, denn wenn Sie auf die innere Abfrage schauen, wird es eine Spalte mit ename und seiner Länge erzeugen, wie unten gezeigt.

%Vor%

Die obige Funktion liefert also das Ergebnis bis garima .... nicht bis ansh , weil listagg auf der Länge der inneren Abfrage basiert.

    
Gaurav Soni 07.09.2012 10:50
quelle