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

Oracle Discussion :

ORA-01489: résultat de concaténation de chaine trop long


Sujet :

Oracle

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut ORA-01489: résultat de concaténation de chaine trop long
    Bonjour,

    J'ai un un probléme dans le bout de code ci-dessous. aprés un rajout d'entité dans la table entity, il s'avére que mon bout de code renvoi une chaine dépassant les 4000 caractères. j'ai essayé d'utiliser la fonction to_clob, mais je penses l'avoir mal utilisé.

    Est ce que qq'un peut m'aclaircir comment intergrer la fonction to_clob dans mon code ou me proposer d'autres solutions éventuellement.

    je vous remercie d'avance pour vos réponses

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    select replace (NVL(ent.liste_entity, 'ENTITY')
           ||';'|| upper(nvl(o.cd_cat, 'cat'))
           ||';'|| id_annuaire
           ||';'|| cd_rep
           ||';'|| cd_trt
           ||';'|| b_nat_con
           ||';'|| decode(cd_month,'00','YEAR','01','JAN','02','FEB','03','MAR','04','APR','05','MAY','06','JUN','07','JUL','08','AUG','09','SEP','10','OCT','11','NOV','12','DEC')
           ||';'|| decode(b_nat_con,'1','@LEVMBRS(NATURE,0)','2','@REMOVE(@LEVMBRS(NATURE,0),(@LEVMBRS(NATURE,0) AND @DESCENDANTS(LOCALDATA)))','3','@LEVMBRS(NATURE,0)')
           ||';'|| (select fnt_agg_level('1326673') from dual)
           ||';'|| cd_cat_src     
           , ' ', 'SPACE') LIGNE 
    from   
           tch_action o,
           rep r,
           (select MAX(LTRIM(sys_connect_by_path(cd_entity,'|'),'|')) liste_entity
            from (
                SELECT distinct cd_entity , DENSE_RANK() over(order by cd_entity) rn
                FROM   entity e
                where cd_rep=(select r.cd_rep from rep r where r.dt_end is null)
                and cd_hierarchie = '0'
                and leaf = 1
                connect by  prior e.cd_entity =  e.ent_cd_entity 
                        and prior cd_rep=cd_rep
                        and prior cd_hierarchie = '0'
                start with e.cd_entity in (
                                select em.cd_entity  from entity_multiple em
                                where em.num_seq ='1326673'
                           )
                         and cd_rep = (select r.cd_rep from rep r where r.dt_end is null)
                         and cd_hierarchie = '0'
                  )
            connect by prior rn+1 = rn
            start with rn = 1
            ) ent       
    where  o.num_seq = '1326673'
    and    r.dt_end is null;
    Cordialement

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Pourquoi avez-vous besoin de cette concaténation ?

    Apparement vous générez un fichier CSV, vous pouvez procéder autrement !

  3. #3
    En attente de confirmation mail
    Inscrit en
    Mars 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 205
    Points : 230
    Points
    230
    Par défaut
    Effectivement, je ne te conseille pas d'utiliser la concaténation de CLOB, si tu as beaucoup de lignes, ta requête risque de prendre des plombes à s'exécuter.

    Sinon, si tu veux tenter, applique la fonction to_clob à un de tes champs, la concaténation effectuera alors une conversion implicite de chaque colonne, et ton résultat sera évidemment un clob.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 331
    Points : 394
    Points
    394
    Par défaut
    Si tu tiens vraiment à ta requête telle quelle, tu pourras utiliser la fonction TO_CLOB comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    SQL> create table t2 (col1 varchar2(3000), col2 varchar2(3000));
     
    Table created.
     
    SQL> 
    SQL> insert into t2 values ( rpad('x', 3000, 'x'), rpad('X', 3000, 'X'));
     
    1 row created.
    SQL> commit;
     
    Commit complete.
     
    SQL> 
    SQL> select col1 || ';' || col2 from t2;
    select col1 || ';' || col2 from t2
                                     *
    ERROR at line 1:
    ORA-01489: result of string concatenation is too long
     
    SQL> set long 10000
    SQL> select to_clob(col1 || ';' || col2) from t2;
    ERROR:
    ORA-01489: result of string concatenation is too long
     
    SQL> select to_clob(col1) || ';' || to_clob(col2) MA_COLONNE from t2;
     
    MA_COLONNE
    --------------------------------------------------------------------------------
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx .........
     
    SQL>
    Rachid A.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses

    En effet j'ai besoin de cette concaténation qui me permet de récupérer la liste de toutes mes entités (qui à elle seuls dépassent deja les 4000 caractères) concaténé à d'autres paramêtre en vue de l'exploiter dans le process de consolidation (tout est gérés sous unix)

    Waldar : quelle autre solution je pourrais utiliser?

    mydb_server: en essayant de procéder tel que vous me l'avez conseillé j'ai toujours le même problème.

    voilà ou le problème se pose et comment j'ai integré la fonction to_clob

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     
    SELECT MAX(LTRIM(sys_connect_by_path(to_clob(cd_entity),'|'),'|')) liste_entity
            FROM (
                SELECT DISTINCT cd_entity , DENSE_RANK() over(ORDER BY cd_entity) rn
                FROM   entity e
                WHERE cd_rep=(SELECT r.cd_rep FROM rep r WHERE r.dt_end IS NULL)
                AND cd_hierarchie = '0'
                AND leaf = 1
                connect BY  prior e.cd_entity =  e.ent_cd_entity 
                        AND prior cd_rep=cd_rep
                        AND prior cd_hierarchie = '0'
                start WITH e.cd_entity IN (
                                SELECT em.cd_entity  FROM entity_multiple em
                                WHERE em.num_seq ='1326673'
                           )
                         AND cd_rep = (SELECT r.cd_rep FROM rep r WHERE r.dt_end IS NULL)
                         AND cd_hierarchie = '0'
                  )
            connect BY prior rn+1 = rn
            start WITH rn = 1
    le sous select me renvoi 805 entity avec 5 caractère chacune.

    Merci pour vos réponses

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 331
    Points : 394
    Points
    394
    Par défaut
    C'est la fonction SYS_CONNECT_BY_PATH qui pose problème :

    Both column and char can be any of the datatypes CHAR, VARCHAR2, NCHAR, or NVARCHAR2. The string returned is of VARCHAR2 datatype and is in the same character set as column.
    Rachid A.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820

Discussions similaires

  1. "Paramètre de la chaine trop long"
    Par devdev dans le forum VBA Access
    Réponses: 4
    Dernier message: 13/10/2017, 15h39
  2. Concaténéation de chaine dans un group by
    Par Delphi-ne dans le forum Requêtes
    Réponses: 4
    Dernier message: 28/01/2006, 00h11
  3. Chaine trop longue
    Par valoji dans le forum Bases de données
    Réponses: 1
    Dernier message: 18/10/2005, 14h10
  4. Erreur ORA-01704 : constante de chaine trop longue
    Par verrec_s dans le forum Oracle
    Réponses: 22
    Dernier message: 13/12/2004, 15h30
  5. chaine trop longue pour envoyer en socket?
    Par jeje.r dans le forum C++Builder
    Réponses: 10
    Dernier message: 27/06/2003, 16h36

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