LISTAGG de la fonction: “résultat de la concaténation de chaîne est trop longue”
Je suis en utilisant Oracle SQL developer version 3.0.04. J'ai tenté d'utiliser la fonction LISTAGG
pour regrouper les données de l'ensemble..
CREATE TABLE FINAL_LOG AS
SELECT SESSION_DT, C_IP, CS_USER_AGENT,
listagg(WEB_LINK, ' ')
WITHIN GROUP(ORDER BY C_IP, CS_USER_AGENT) "WEB_LINKS"
FROM webviews
GROUP BY C_IP, CS_USER_AGENT, SESSION_DT
ORDER BY SESSION_DT
Cependant, je reçois l'erreur,
SQL Error: ORA-01489: result of string concatenation is too long
Je suis assez sûr que la sortie peut être plus de 4000, depuis le WEB_LINK mentionné ici est un concaténées valeur de l'url de la tige et l'url de la requête.
Est-il un moyen de le contourner ou est-il une autre alternative?
OriginalL'auteur user1874311 | 2012-12-10
Vous devez vous connecter pour publier un commentaire.
Depuis les agrégats de la chaîne peut être plus de 4000 octets, vous ne pouvez pas utiliser la
LISTAGG
fonction. Vous pourriez éventuellement créer un définis par l'utilisateur fonction d'agrégation qui renvoie unCLOB
plutôt qu'unVARCHAR2
. Il est un exemple d'un agrégat défini par l'utilisateur qui renvoie unCLOB
dans le original askTom discussion que Tim liens à partir de cette première discussion.À partir d'Oracle 12cR2,
listagg
prend en charge uneon overflow
clause de tronquer le résultat, si ça devient trop long: stackoverflow.com/a/46894364/312881OriginalL'auteur Justin Cave
Ce sera le retour de clob valeur, donc pas de limite de lignes.
c'est un bon truc, mais sachez qu'il semble pour convertir le code html des caractères spéciaux (par exemple, au lieu de " vous obtenez ' )
Il y a une limite à 11g/12c: 176TB par clob 🙂
quelqu'un expliquer cette réponse. quel est le point de
.EXTRACT('//text()')
et pourquoiXMLELEMENT(E,colname,',')
reçu trois paramètreJuste une remarque, j'ai essayé et la requête s'est ÉCRASÉ TOUTE INSTANCE ORACLE. Oups. Nous sommes en cours d'exécution de Base de données Oracle 12c Libération 12.1.0.1.0 - 64 bits sur Windows. Alors peut-être que, contrairement à moi, essayez-la dans un environnement de non-production de la première.
OriginalL'auteur Ankur Bhutani
Vous dépassez la SQL limite de 4000 octets qui s'applique à
LISTAGG
ainsi.Comme une solution de contournement, vous pouvez utiliser XMLAGG.
Par exemple,
Si vous voulez concaténer plusieurs colonnes qui ont 4000 octets, vous pouvez concaténer les XMLAGG de sortie de chaque colonne pour éviter le SQL limite de 4000 octets.
Par exemple,
Oui, c'est fait.
ouais j'ai totalement abandonné XMLAGG chemin, trop de questions. Je suis juste en utilisant une BOUCLE et la concaténation, fonctionne parfaitement
Les avantages et les inconvénients de l'utilisation de
cast as clob
outo_clob()
vsGetClobVal()
intéressant de savoir à propos ?GetClobVal()
est XMLType méthode pour extraire des données XML, de manière explicite à un casting pour CLOB est complètement différent dans ce contexte. Si vous avez l'intention d'utiliser une conversion explicite au lieu de GetClobVal pour récupérer des données XML, alors il n'est pas recommandé.OriginalL'auteur Lalit Kumar B
listagg
ai récemment couvert par la norme ISO SQL (SQL:2016). Dans le cadre de cela, il a également obtenu unon overflow
clause, qui est pris en charge par Oracle 12cR2.La
on overflow
clause prend en charge untruncate
option (comme alternative à la valeur par défauton overflow error
comportement).L'option par défaut pour les trois périodes (...) et sera ajouté comme dernier élément si la troncature se passe.
Si avec le comte est spécifié et la troncature cas, le nombre de valeurs omises est mis entre parenthèses et ajouté au résultat.
Plus sur
listagg
'son overflow
clause: http://modern-sql.com/feature/listaggOriginalL'auteur Markus Winand
Une nouvelle fonctionnalité ajoutée dans 12cR2 est le
ON OVERFLOW
clause deLISTAGG
.La requête, y compris la présente clause ressemblerait à:
Permettra de limiter les résultats à 4000 caractères, mais ne sera pas jeter le
ORA-01489
erreur.Ces sont quelques-uns des autres options de
ON OVERFLOW
clause:ON OVERFLOW TRUNCATE 'Contd..'
: Cela permet d'afficher'Contd..'
àla fin de la chaîne (valeur par Défaut est
...
)ON OVERFLOW TRUNCATE ''
: Cela permet d'afficher les 4000 caractèressans aucune terminaison de chaîne.
ON OVERFLOW TRUNCATE WITH COUNT
: Cela permet d'afficher le totalnombre de caractères à la fin, après les caractères de fin.
Par exemple:- '
...(5512)
'ON OVERFLOW ERROR
: Si vous pensez que leLISTAGG
échec avec l'ORA-01489
d'erreur ( Qui est par défaut de toute façon ).LISTAGG Améliorations dans 12c R2
OriginalL'auteur Kaushik Nayak
Je pouvais tolérer mon champ concaténé dans plusieurs lignes à moins de 4000 limite de caractères, le texte suivant:
OriginalL'auteur Ferdie
Ajoutant à la accepté de répondre.
J'ai rencontré un problème similaire et a fini à l'aide d'une fonction définie par l'utilisateur qui a renvoyé clob au lieu de varchar2. Voici ma solution:
Maintenant, au lieu de faire
Que j'ai à faire ce
OriginalL'auteur Chiranjib
La gestion des débordements dans LISTAGG
Nous pouvons utiliser la Base de données 12c SQL correspondant à un modèle de fonction, MATCH_RECOGNIZE, pour retourner une liste de valeurs qui ne dépasse pas la limite.
Exemple de code et plus d'explication dans le lien ci-dessous.
https://blogs.oracle.com/datawarehousing/entry/managing_overflows_in_listagg
OriginalL'auteur Abhishek Maurya
Nous avons été en mesure de résoudre un problème similaire ici de l'utilisation d'Oracle LISTAGG. Il y avait un point où ce que nous étions au groupement de dépassement de la 4K, mais cela a été résolu facilement par le fait d'avoir le premier jeu de données de prendre les 15 premiers éléments de l'agrégat, qui ont chacune un 256K limite.
Plus d'info: Nous avons des projets, qui ont des ordres de modification, qui à son tour avoir des explications. Pourquoi la base de données est mis en place pour modifier le texte en blocs de 256 ko limites n'est pas connue, mais c'est l'une des contraintes de conception. Pour que l'application qui alimente le changement des explications dans le tableau s'arrête à 254K et inserts, puis obtient la prochaine série de texte et si > 254K génère une autre ligne, etc. Donc, nous avons un projet à un changement de l'ordre de 1:1. Ensuite, nous avons comme 1:n pour les explications. LISTAGG concatène toutes ces. Nous avons RMRKS_SN valeurs, 1 pour chaque remarque et/ou pour chaque 254K de caractères.
Le plus grand RMRKS_SN a été trouvé pour le 31, j'ai donc fait le premier jeu de données en tirant SN 0 à 15, le 2ème dataset de 16 à 30 ans et le dernier dataset 31 à 45 -- hey, let's plan sur quelqu'un ajout de BEAUCOUP d'explications à certains ordres de changement!
Dans le générateur de rapport, le tableau Matriciel des liens pour le premier jeu de données. Pour obtenir les autres données, voici l'expression:
=Premier(Champs!NON_STD_TXT.Valeur, "DataSet_EXPLAN") & la Première(les Champs!NON_STD_TXT.Valeur, "ds_EXPLAN_SN_16_TO_30") & la Première(les Champs!NON_STD_TXT.Valeur, "ds_EXPLAN_SN_31_TO_45")
Pour nous, nous devons avoir le Groupe DB de créer des fonctions, etc. en raison de contraintes de sécurité. Donc, avec un peu de créativité, nous n'avons pas à faire à un Utilisateur d'Agrégats ou d'une UDF.
Si votre application a une sorte de SN regrouper les données, cette méthode devrait fonctionner. Je ne sais pas ce que l'équivalent TSQL est -- nous avons la chance d'avoir affaire à Oracle pour ce rapport, qui LISTAGG est une Aubaine.
Le code est:
Et dans les 2 autres ensembles de données il suffit de sélectionner le LISTAGG seulement pour les sous-requêtes dans la DE:
DE ...
...
... et ainsi de suite.
Je suis totalement d'accord, on a presque semble que certaines personnes n'ont tout simplement comme ils sont en colère contre le monde ou quelque chose. À mon humble avis, ce qui devrait leur drapeau gens que voter pour le modérateur de l'examen!
OriginalL'auteur Michael Durthaler
Dans certains scénarios, l'intention est d'obtenir toutes les DISTINCTES LISTAGG clés et le débordement est causé par le fait que LISTAGG concatène TOUS clés.
Voici un petit exemple
Si les groupes sont grandes, à la répétition des touches de rejoindre rapidement le permis de longueur maximale et vous obtenez le
ORA-01489: result of string concatenation is too long
.Malheureusement, il n'existe pas de support pour
LISTAGG( DISTINCT y, '; ')
mais comme une solution de contournement peut être utilisé que LISTAGG ignore les valeurs Null. à l'Aide de la fonction ROW_NUMBER nous ne considérons que la première clé.Bien sûr le même résultat peut être atteint à l'aide de
GROUP BY x,y
dans la sous-requête. L'avantage deROW_NUMBER
est que toutes les autres fonctions d'agrégation peut être utilisé comme illustré avecSUM(z)
.OriginalL'auteur Marmite Bomber
Court de l'aide 12c de débordement à l'aide de la CLOB et substr travaillera également
rtrim(dbms_lob.substr(XMLAGG(XMLELEMENT(E,column_name,',').EXTRAIT de('//text()') ORDER BY column_name).GetClobVal(),1000,1),',')
OriginalL'auteur nosqlforme