2017-07-03 2 views
1

J'ai une simple requête Select qui agrège une colonne contenant des textes volumineux. Ce qui suit a fonctionné pour moi avec de petits textes, mais Je dépasse maintenant la limite de caractères Listagg (4000 octets?).Oracle SQL: Alternative pour agréger des textes volumineux (en cas de dépassement de la limite Listagg)

Je suis très nouveau à Oracle et ne pouvais pas trouver une solution appropriée pour ce en ligne que je pourrais appliquer ici.

Quelqu'un peut-il me dire la meilleure alternative?

Recherche Mon (simplifié):

SELECT 
    m.S_ID AS SID 
    , LISTAGG 
    (
     'ITEM NO.: ' || m.ITEM || 
     ' -nl-ARTICLE: ' || a.ARTICLE || 
     ' -nl-NET: ' || m.NET || 
     ' -nl-TAX: ' || NVL(m.TAX, 0) || 
     ' -nl-GROSS: ' || (m.NET + m.TAX), 
     ' -nl--nl-' 
    ) WITHIN GROUP (ORDER BY m.S_ID) AS Details 
    /* ... */ 
FROM 
    myTable m 
/* ... */ 

Un grand merci pour toute aide, ce
Mike

+1

Si 32k suffit alors simplement mettre '' MAX_STRING_SIZE' à extended': https://docs.oracle.com/database/121/REFRN/GUID-D424D23B-0933-425F -BC69-9C0E6724693C.htm # REFRN10321 –

+0

@a_horse_with_no_name: Merci pour ça. 32k suffirait car j'attends seulement jusqu'à 10k caractères pour les items max mais je ne peux pas apporter de changements aux paramètres db ou SQL généraux dans ce cas. – keewee279

Répondre

1

L'une des méthodes possibles.

select xmlagg(xmlelement(xxx,'ITEM NO.: ' || m.ITEM || 
     ' -nl-ARTICLE: ' || a.ARTICLE || 
     ' -nl-NET: ' || m.NET || 
     ' -nl-TAX: ' || NVL(m.TAX, 0) || 
     ' -nl-GROSS: ' || (m.NET + m.TAX), 
     ' -nl--nl-'||',<-separator').extract('//text()') order m.S_ID).getClobval() from mytable 
group by ... 

2ème méthode. oracle permet de creat propre fonction d'agrégation user defined aggregation function

+0

Merci beaucoup pour ça! Pourrais-tu l'expliquer un peu puisque je suis très nouveau à Oracle pour que je puisse l'appliquer correctement? Est-ce que ceci n'a aucune limite de caractère (parlant peut-être jusqu'à 10000 caractères)? – keewee279

+1

Ici, vous avez une limite de 4Go. Si vous supprimez .extract ('// text()') du code, vous verrez le fichier XML normal. –

+0

Merci beaucoup. Je vais accepter cela et j'aime vraiment l'approche. Pourriez-vous juste ajouter une ou deux phrases pour expliquer le but de "xxx" et ".getClobval"? – keewee279