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 :

Erreur Concatenation Requête Oracle


Sujet :

SQL Oracle

  1. #1
    Membre très actif
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Par défaut Erreur Concatenation Requête Oracle
    Bonjour les gars,

    j'ai une question a propos d'une erreur d’exécution de requête ,quand j'exécute une requête pour avoir le nom des chefs de projet , j'ai l'erreur suivante :
    ORA-01489: résultat de concaténation de chaîne trop long

    voici ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select LISTAGG(usr.USURNAME ||' '||usr.UNAME,' | ') WITHIN GROUP (ORDER BY 1)
    from  
    T_FND_USER usr
    ,T_TLK_TENDER ds
    ,T_TLK_USER_PROFILE prf
    ,T_TLK_TENDER_ASG asg
    ,T_TLK_RFQ rfq 
    where  ds.tender_code =rfq.TENDER_CODE
    and asg.TENDER_CODE =ds.TENDER_CODE
    and asg.USER_ID =usr.USER_ID
    and prf.OID =usr.PROFILE_OID
    and upper(prf.name) like upper('Chef%projet%')
    quelqu'un aurait une proposition ?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 138
    Par défaut
    Il me semble que le message est clair...

    Quelle est la longueur des chaines que tu cherches à regrouper sur une ligne ?
    Combien d'occurrences seront-elles ainsi concaténées ?

    Et la question la plus importante : Est-ce bien cela que tu cherches à faire ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre très actif
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Par défaut
    en effet ce n'est pas moi qui a fait la requête , c'est une personne du service bases de données , et moi je dois l'intégrer dans mon interface ODI pour avoir une liste des chefs de projets , la requête est longue , mois je teste partie par partie , et sur ce niveau la de la requête ça me donne cette erreur

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    LISTAGG est limité à 4000 caractères, et sort en erreur "ORA-01489: résultat de concaténation de chaîne trop long" si ça dépasse.

  5. #5
    Membre très actif
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Par défaut
    donc la solution est quoi ?

  6. #6
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Ca dépend de ce que tu veux faire.

    Déjà, il faut vérifier que la requête est correcte et qu'elle en te renvoie pas de doublons.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT usr.USURNAME ||' '||usr.UNAME, COUNT(*)
    FROM T_FND_USER usr, T_TLK_TENDER ds, T_TLK_USER_PROFILE prf, T_TLK_TENDER_ASG asg, T_TLK_RFQ rfq 
    WHERE ds.tender_code =rfq.TENDER_CODE
    AND asg.TENDER_CODE =ds.TENDER_CODE
    AND asg.USER_ID =usr.USER_ID
    AND prf.OID =usr.PROFILE_OID
    AND UPPER(prf.NAME) LIKE UPPER('Chef%projet%')
    GROUP BY usr.USURNAME ||' '||usr.UNAME
    having count(*) > 1
    Vérifier aussi la taille de ce que tu veux regrouper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT SUM(LENGTH(usr.USURNAME ||' '||usr.UNAME)) + GREATEST(COUNT(*) -1, 0) * LENGTH(' | ')  taille_totale
    FROM T_FND_USER usr, T_TLK_TENDER ds, T_TLK_USER_PROFILE prf, T_TLK_TENDER_ASG asg, T_TLK_RFQ rfq 
    WHERE ds.tender_code =rfq.TENDER_CODE
    AND asg.TENDER_CODE =ds.TENDER_CODE
    AND asg.USER_ID =usr.USER_ID
    AND prf.OID =usr.PROFILE_OID
    AND UPPER(prf.NAME) LIKE UPPER('Chef%projet%')
    Ensuite, si tout est correct, il faudra le faire sans LISTAGG et gérer l’agrégation en PLSQL ou autre.

  7. #7
    Membre très actif
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Par défaut
    la requête retourne des doublons , et la taille_totale est 11920

  8. #8
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Comme je l'ai dit, ça dépend de ce que tu souhaites comme résultat.
    Si les doublons ne sont pas voulu, il faut les supprimer (soit un DISTINCT, soit refaire la requête), puis faire le listagg sur le résultat

  9. #9
    Membre très actif
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Par défaut
    il faut des doublons car par la suite cette requête sera lié a d'autres interfaces donc un service peut avoir plusieurs chef de projet comme un chef de projet peut avoir plusieurs services

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 964

  11. #11
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 964
    Par défaut
    Amélorations de LISTAGG:
    12c a ajouté « on error ... »
    19c a ajouté « distinct »

    Pour les versions antérieures il est possible d‘éliminer les doublons en utilisant le fait que LISTAGG n’utilise pas les NULL :
    en mettant un LAG dans un DECODE vous pouvez transformer la valeur en NULL si elle est égale à celle de la ligne précédente en triant correctement dans le OVER.

    Sinon les 2 méthodes de contournement pour le problème de taille sont via XML ou JSON qui supporte « RETURNING CLOB ».

Discussions similaires

  1. Erreur Requête Oracle
    Par amalch dans le forum Oracle
    Réponses: 1
    Dernier message: 03/04/2013, 16h43
  2. Réponses: 8
    Dernier message: 26/05/2011, 13h20
  3. Voir les dernières requête Oracle
    Par newchurch dans le forum Oracle
    Réponses: 4
    Dernier message: 12/04/2005, 00h41
  4. [Forms 6i] FRM-40502 : erreur Forms ou Oracle ?
    Par macben dans le forum Forms
    Réponses: 11
    Dernier message: 01/12/2004, 18h16
  5. [CR] erreur de driver oracle
    Par cdu dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 10/09/2004, 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