IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Oracle10 : concatener champs texte de plusieurs lignes


Sujet :

SQL Oracle

  1. #21
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Je ne pense pas que je vais installer la wm manuellement et je n'ai pas besoin d'ouvrir un ticket sur métalink. Désolé, mais c'est une fonction pour impressionner les âmes sensibles sur les forums (big c'est all_objects)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SQL> select count(*)
      2  from big;
     
      COUNT(*)
    ----------
        398632
     
    SQL> select owner, wmsys.wm_concat(object_name)
      2  from big
      3  group by owner
      4  ;
    ERROR:
    ORA-22813: la valeur de l'opÚrande dÚpasse les limites systÞme
    Par titre de comparaison essayez (un exemple classique pour ce type de problème)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select owner, cursor(select object_name from big b where b.owner = a.owner)
    from (select distinct owner from big) a
    Bien sur je suis prêt à changer d'avis si vous m'expliques comment contourner l'erreur ou quelles sont les limites de la fonction. Mais pour l'instant je viens d'oublier cette solution.

  2. #22
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    un desc de wmsys devrait permettre de voir les limites pour faire un traitement par lot

  3. #23
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par orafrance Voir le message
    un desc de wmsys devrait permettre de voir les limites pour faire un traitement par lot
    Vous voulez dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SQL> desc wmsys.wm_concat
    FUNCTION wmsys.wm_concat RETURNS VARCHAR2
     Nom d'argument                  Type                    E/S par dÚfaut ?
     ------------------------------ ----------------------- ------ --------
     P1                             VARCHAR2                IN
    Bingo mais je ne l'utiliserais pas.

  4. #24
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    faut quand même dire que concaténer 32000 caratères c'est pas super lisible, ce type de besoin doit surtout apparaitre pour quelques lignes à concaténer j'imagine... pas des centaines

  5. #25
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    J'étais mauvais joueur

  6. #26
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    tu peux toujours employer XMLAGG pour retourner un CLOB

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select 
       xmlagg(xmlelement(str,object_name||',')).extract('/STR/text()').getclobval() 
    from 
       all_objects;

  7. #27
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Pour ceux que cela intéresse, voici le code d'une fonction d'aggrégation permettant de concaténer n lignes (ce qui doit revenir à ce que fait wmsys.wm_concat() ) :
    http://asktom.oracle.com/pls/asktom/...:2196162600402
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  8. #28
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Merci plaineR, Laurent. Je suis passé complètement à coté du stragg (je l’ai lu à travers sans faire l’effort de comprendre)

    Voilà aussi ce que Tom Kyte dit à propos de wm_concat
    my suggestion is going to be consistent....

    Never use undocumented stuff, it is subject to change, removal, broken-ness without recourse.

    either

    a) use stragg
    b) write your own
    c) use the connect by trick.

  9. #29
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 073
    Points
    8 073
    Par défaut
    Citation Envoyé par mnitu Voir le message
    ...use the connect by trick
    "CONNECT BY TRICK" ? Mais c'est pas documenté cette syntaxe !!
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  10. #30
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par tom kyte
    Never use undocumented stuff, it is subject to change, removal, broken-ness without recourse.
    Je ne peux qu'approuver cette recommendation

    Citation Envoyé par Pomalaix
    "CONNECT BY TRICK" ? Mais c'est pas documenté cette syntaxe !!
    oui, et stragg n'est pas tellement documenté non plus

    bon, connect by prior + row_number me semble en ordre, c'est une astuce mais ça ne crée pas de LOOP, donc on peut l'employer.

    A choisir, je trouve MODEL plus élégant que CONNECT BY. J'ai posté à l'instant un essai sur le site de Tom Kyte.
    http://asktom.oracle.com/pls/asktom/...:2196162600402

  11. #31
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 073
    Points
    8 073
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    CONNECT BY TRICK...oui, et stragg n'est pas tellement documenté non plus
    Mff, moi ma remarque était une simple vanne : je voulais juste dire que je n'avais jamais vu le mot clé TRICK dans le diagramme syntaxique du CONNECT BY...
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  12. #32
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Laurent,
    j'ai testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT 
       xmlagg(xmlelement(str,object_name||',')).extract('/STR/text()').getclobval() 
    FROM 
       big_table
    Et au bout d'une heure il à rendu son âme avec "Ora 04030 mémoire de traitement manquante lors ...".
    Par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    declare
        TYPE tb is table of varchar2(30);
        l_data tb;
      begin
        select object_name
         bulk collect into l_data
         from big_table;
        --
       dbms_output.put_line(to_char(l_data.count));
     end;
     
    1052736
    s'exécute en 3 seconde.

    Je pense que stragg est documenté ici

  13. #33
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Laurent,
    j'ai testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT 
       xmlagg(xmlelement(str,object_name||',')).extract('/STR/text()').getclobval() 
    FROM 
       big_table
    Et au bout d'une heure il à rendu son âme avec "Ora 04030 mémoire de traitement manquante lors ...".
    pas de chance

    Citation Envoyé par mnitu Voir le message
    Par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    declare
        TYPE tb is table of varchar2(30);
        l_data tb;
      begin
        select object_name
         bulk collect into l_data
         from big_table;
        --
       dbms_output.put_line(to_char(l_data.count));
     end;
     
    1052736
    s'exécute en 3 seconde.
    quel rapport?

    Je pense que stragg est documenté
    STRAGG et WM_CONCAT sont identiques. Les deux se basent sur UDAG. Si tu employe STRAGG, ce ne sera pas beaucoup plus "documenté" que WM_CONCAT. Par contre WM_CONCAT est wrappé, donc si ça ne marche pas comme prévu, c'est pas de chance, tant dit qu'avec STRAGG, tu peux toujours déboggué toi même pour trouver la bulle...

    Bon, moi je vois un avantage dans WM_CONCAT, c'est qu'il n'y a pas besoin d'avoir de privilèges style CREATE TYPE et CREATE PROCEDURE pour l'employer

  14. #34
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    Mff, moi ma remarque était une simple vanne : je voulais juste dire que je n'avais jamais vu le mot clé TRICK dans le diagramme syntaxique du CONNECT BY...

  15. #35
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    quel rapport?
    Je pensai écrire une procédure pour récupérer dans un clob, j'ai laissé tomber

    Citation Envoyé par laurentschneider Voir le message

    STRAGG et WM_CONCAT sont identiques.
    D'accorde à 100% J'ai fait un desc du wmsys.wm_concat_impl. C'est stragg sauf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CURR_STR                                           VARCHAR2(32767)
    Donc dans stragg on peut voir l'implémentation.

    Citation Envoyé par laurentschneider Voir le message

    Bon, moi je vois un avantage dans WM_CONCAT, c'est qu'il n'y a pas besoin d'avoir de privilèges style CREATE TYPE et CREATE PROCEDURE pour l'employer
    Argument non retenu à cause de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create or replace type wmsys.Wm_Concat_Impl wrapped
    Je vois deux désavantages pour une utilisation en production
    • nécessité d'installer/vérifier l'install du WM sur N site. Est-ce que WM est disponible dans toutes les éditions d'Oracle? Est-ce que ça se mérite de installer N objets pour une fonction ? Il me semble que le Wm est dédié plutôt aux développeurs.
    • le fait quelle est non-documenté

    Pour moi c'est non.

  16. #36
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Pour moi c'est non.
    je vois ça

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Champ text avec plusieurs lignes ?
    Par Death83 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 17/10/2006, 12h42
  2. 8i : sql loader et champ texte sur plusieurs lignes
    Par naonedboy dans le forum SQL*Loader
    Réponses: 1
    Dernier message: 23/11/2005, 11h07
  3. [JButton] Texte sur plusieurs lignes
    Par leminipouce dans le forum Composants
    Réponses: 5
    Dernier message: 19/10/2005, 11h17
  4. [CR10 ]un texte sur plusieurs lignes?
    Par speed034 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 28/09/2005, 08h26
  5. Réponses: 2
    Dernier message: 21/09/2005, 13h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo