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 :

Retrouver la ligne qui créer l'erreur


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 45
    Points : 24
    Points
    24
    Par défaut Retrouver la ligne qui créer l'erreur
    Bonjour,

    Sur ORACLE 7.3.4, j'ai une requête qui s'exécute chaque nuit et qui met à jour les champs d'une table (update), par rapport aux saisies et modifications de la journée sur d'autres tables. Cette requête fonctionne correctement depuis plus de 6 ans.

    Aujourd'hui cette requête me génére une erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-01427: Sous-interrogation ramenant un enregistrement de plus d'une ligne
    Impossible de retrouver l'enregistrement erroné parmis les 100 000 enregistrements de mes tables.

    Ma question est la suivante, est il possible sous ORACLE, d'afficher à quelle ligne s'arrête l'execution de la requête pour retrouver facilement l'enregistrement qui pose probléme, et non pas le numéro d'erreur ORACLE ?

    Je ne mets volontairement pas la requête, puisqu'elle fonctionnait trés bien jusqu'à maintenant et qu'il n'y a eu aucune modification du code SQL. Le probléme vient bien des enregistrements de mes tables.

    D'avance merci

    Fred

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Pourquoi ne pas capturer l'erreur - je ne sais si cette ORA précisément peut être capturée - dans une exception qui logguerait des données permettant d'identifier la requête incriminée ?

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Magnus
    Pourquoi ne pas capturer l'erreur - je ne sais si cette ORA précisément peut être capturée - dans une exception qui logguerait des données permettant d'identifier la requête incriminée ?
    Justement .... je ne sais pas comment on fait

    Fred

  4. #4
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Ma question est la suivante, est il possible sous ORACLE, d'afficher à quelle ligne s'arrête l'execution de la requête pour retrouver facilement l'enregistrement qui pose probléme, et non pas le numéro d'erreur ORACLE ?
    Il n'y a probablement pas de façon simple de faire cela. Dans votre cas, j'essaierais de transformer et de simplier la requête en un SELECT en gardant les mêmes sous-requêtes qui essaieraient d'afficher les données qui posent problème.

    Je ne mets volontairement pas la requête, puisqu'elle fonctionnait trés bien jusqu'à maintenant et qu'il n'y a eu aucune modification du code SQL. Le probléme vient bien des enregistrements de mes tables.
    Il vaudrait mieux avoir la requête pour vous aider dans ce cas là... Si votre requête n'a pas prévu ce cas et les données respectent toutes les contraintes, cela peut aussi être un problème de code SQL...

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    le plus simple c'est encore de faire un curseur avec un bloc EXCEPTION

    mais c'est pas non plus très compliqué d'ajouter un WHERE ROWNUM = 1 dans une sous-requête type : colonne = (SELECT ...) pour confirmer que l'erreur vient de là

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Fred_D
    le plus simple c'est encore de faire un curseur avec un bloc EXCEPTION
    Aille je suis pas trés à l'aise avec le PL/SQL

    ci joint la requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    update table1
    set      (t1_chp1, t1_chp2, t1_chp3, t1_chp4, t1_chp5, t1_chp6, t1_chp7)
    = (select t2_chp1, t2_chp2, t2_chp3, t2_chp4, t2_chp5, t2_chp6, t2_chp7)
              from table2
              where t2_chp8 = t1_chp8
              and t2_chp9 is null
              and t2_chp10 = 1)
    where
    exists (select t2_chp8 from table2
              where t2_chp8 = t1_chp8
              and t2_chp9 is null
              and t2_chp10 = 1);
    Fred

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    comme je l'ai dit la requête suivante retourne plusieurs lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select t2_chp1, t2_chp2, t2_chp3, t2_chp4, t2_chp5, t2_chp6, t2_chp7)
              from table2
              where t2_chp8 = t1_chp8
              and t2_chp9 is null
              and t2_chp10 = 1
    elle ne devrait en retourner qu'une seule

  8. #8
    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
    et donc pour savoir quelles valeurs sont doublée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select t2_ch8
    from table2, table1
    where t2_chp8 = t1_chp8
       and t2_chp9 is null
       and t2_chp10 = 1
    group by t2_ch8
    having count(*) > 1

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par plaineR
    et donc pour savoir quelles valeurs sont doublée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select t2_ch8
    from table2, table1
    where t2_chp8 = t1_chp8
       and t2_chp9 is null
       and t2_chp10 = 1
    group by t2_ch8
    having count(*) > 1
    J'avais en premier lieu lancé cette requête pour trouver les champs en double.
    La requête m'a resortie 7 doublons

    J'ai donc lancé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    update table1
    set      (t1_chp1, t1_chp2, t1_chp3, t1_chp4, t1_chp5, t1_chp6, t1_chp7)
    = (select t2_chp1, t2_chp2, t2_chp3, t2_chp4, t2_chp5, t2_chp6, t2_chp7)
              from table2
              where t2_chp8 = t1_chp8
              and t2_chp9 is null
              and t2_chp10 = 1
              and t2_chp8= 'doublons')
    where
    exists (select t2_chp8 from table2
              where t2_chp8 = t1_chp8
              and t2_chp9 is null
              and t2_chp10 = 1
              and t2_chp8= 'doublons');
    ou doublons prends la valeur d'un des sept doublons trouvés, et ça pour les sept valeurs différentes.

    A chaque fois il m'a retourné:

    Voilà pourquoi je séche ...

  10. #10
    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
    Errare humanum est, je t'ai indiqué une bêtise car ma requête te ramène les champs en doublon dans la table1 également.

    Voici qui devrait mieux fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select t2_ch8
    from table2
    where t2_chp8 in (select t1_ch8 
                      from table1
                      where exists (select t2_chp8 from table2
                                   where t2_chp8 = t1_chp8
                                     and t2_chp9 is null
                                     and t2_chp10 = 1)
      and t2_chp9 is null
      and t2_chp10 = 1
    group by t2_ch8
    having count(*) > 1

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Exact, le doublon était dans la table 2, je ne sais pas pourquoi je suis resté bloqué sur les doublons de la table 1. J'aurais dû m'en rendre compte tout de suite. Surtout qu'aprés refléxion il est tout à fait logique de pouvoir mettre à jour les doublons de la table 1. J'ai honte

    Merci pour votre aide ...

    Fred

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment récupérer la ligne qui a causé une erreur ?
    Par schnee dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 17/09/2014, 16h01
  2. [XL-2007] Retrouver toutes les lignes qui ont une valeur identique dans la colonne A
    Par bartimeus35 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/06/2012, 17h47
  3. [AWK] récupération de lignes qui se suivent
    Par PtiNico dans le forum Linux
    Réponses: 2
    Dernier message: 12/04/2005, 19h44
  4. Réponses: 3
    Dernier message: 21/01/2004, 08h47

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