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

  1. #21
    Expert éminent sénior
    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
    un desc de wmsys devrait permettre de voir les limites pour faire un traitement par lot

  3. #23
    Expert éminent sénior
    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
    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
    J'étais mauvais joueur

  6. #26
    Expert confirmé
    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
    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() ) :
    11_QUESTION_ID:2196162600402" target="_blank">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
    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

    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é
    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.
    11_QUESTION_ID:2196162600402" target="_blank">http://asktom.oracle.com/pls/asktom/...:2196162600402

  11. #31
    Rédacteur

    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
    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é
    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é
    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
    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é
    Citation Envoyé par mnitu Voir le message
    Pour moi c'est non.
    je vois ça