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 :

Identification de la colonne en erreur


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 10
    Par défaut Identification de la colonne en erreur
    Bonjour,

    Lorsqu'on fait une insertion en SQL+ et qu'une donnée est invalide, tel qu'insérer un varchar2 dans un number, on reçoit le numéro d'erreur Oracle (ORA-01722: invalid number) ET la donnée en erreur est soulignée par SQL+. En PL/SQL on ne reçoit que l'erreur Oracle. Pourtant elle est certainement identifiable puisque SQL+ le fait. Comment trouver quelle valeur cause l'erreur?

    P

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    malheureusement ce n'est pas possible.

    peut-être en debug mais je ne connais pas

  3. #3
    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
    Par défaut
    bon, sqlplus te souligne le champ problématique, mais pas la valeur.

    Pour savoir quelle valeur a posé problème, tu peux employer :

    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
     
    SQL> create table t(x number, y number);
     
    Table created.
     
    SQL> exec dbms_errlog.create_error_log('T')
     
    PL/SQL procedure successfully completed.
     
    SQL> insert into t(x,y) values ('1','x')
      2  log errors reject limit unlimited;
     
    0 rows created.
     
    SQL> select * from err$_t;
     
    ORA_ERR_NUMBER$ ORA_ERR_MESG$             OR OR OR X          Y
    --------------- ------------------------- -- -- -- ---------- ----------
               1722 ORA-01722: invalid number    I     1          x

  4. #4
    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
    Par défaut
    au fait, quelle est ta version ?

  5. #5
    Membre éclairé Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Salut tout le monde, salut laurentschneider,

    Ta solution m'intérresse aussi... merci
    Je l'ai essayée et Oralce me sort l'erreure ci-dessous :

    insert into t(x,y) values ('1','x')
    *
    ERROR at line 1:
    ORA-01722: invalid number

    Et du coup, je n'ai aucune ligne dans err$_t

    Merci.
    LBO72

  6. #6
    Membre éclairé Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Précision.. on est en 10g

  7. #7
    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
    Par défaut
    R1 ou R2?

  8. #8
    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
    Par défaut
    insert into t(x,y) values ('1','x') log errors reject limit unlimited;

    ne fonctionne qu'à partir de la 10.2

  9. #9
    Membre éclairé Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    On est 10g r2

    Avec insert into t(x,y) values ('1','x') log errors reject limit unlimited;
    ça marche trés bien.

    Un Grand merci....tu es un chef
    LBO72

  10. #10
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 10
    Par défaut
    Citation Envoyé par laurentschneider
    au fait, quelle est ta version ?
    Oups! J'ai oublié de mentionner 10gR2.

    Pierre

  11. #11
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 10
    Par défaut
    Citation Envoyé par laurentschneider
    bon, sqlplus te souligne le champ problématique, mais pas la valeur.
    Pour savoir quelle valeur a posé problème, tu peux employer :

    SQL> select * from err$_t;
    Wow! Je doutais vraiment que cela puisse être possible.

    Il est minuit. J'essaie ça demain matin au plus tôt.
    Merci Bien.

    Pierre

  12. #12
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 10
    Par défaut
    Citation Envoyé par laurentschneider
    bon, sqlplus te souligne le champ problématique, mais pas la valeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SQL> create table t(x number, y number);
    SQL> exec dbms_errlog.create_error_log('T')
    SQL> insert into t(x,y) values (12,'x') log errors reject limit unlimited;
    SQL> select * from err$_t;
     
    ORA_ERR_NUMBER$ ORA_ERR_MESG$             OR OR OR X          Y
    --------------- ------------------------- -- -- -- ---------- ----------
     1722                   ORA-01722: invalid number    I         12         x
    L'enregistrement en erreur est effectivement logué. Cependant, celà ne nous indique pas quelle colonne de l'enregistrement ou valeur de la colonne a causé l'erreur. Toutes les valeurs des colonnes sont inscrites. Il aurait été intéressant que l'on puisse identifier que l'erreur provient de 'x' dans la colonne Y.
    L'erreur est intéressante dans le cas d'un traitement en batch mais me semble peu utile pour une insertion unique. Si on avait pu identifier la valeur de la colonne en erreur , on pourrait retourner un message à l'utilisateur "Cette donnée est invalide" sans avoir à faire de nombreuses validations de colonnes.

    Pierre

  13. #13
    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
    Par défaut
    c'est juste. En relevant les valeurs, tu peux ensuite rechercher toi même laquelle n'est pas un nombre.

    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
     
    declare
      n number;
      numeric_error exception;
      pragma exception_init(numeric_error,-6502);
    begin
      for f in (select x,y from err$_t) loop
        begin
    	  n:=f.x;
    	exception
    	  when numeric_error then dbms_output.put_line('X is not numeric : '||f.x);
    	end;
        begin
    	  n:=f.y;
    	exception
    	  when numeric_error then dbms_output.put_line('Y is not numeric : '||f.y);
    	end;
      end loop;
    end;
    /
     
    Y is not numeric : x
     
    PL/SQL procedure successfully completed.

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

Discussions similaires

  1. XSD colonne int erreur cast
    Par Jean-Marc68 dans le forum C#
    Réponses: 1
    Dernier message: 07/06/2012, 19h37
  2. Réponses: 0
    Dernier message: 02/12/2009, 10h11
  3. [E-03] - identification d'une colonne
    Par Daejung dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 20/03/2009, 23h53
  4. Réponses: 3
    Dernier message: 08/10/2005, 14h57
  5. Erreur mise en couleur d'une colonne excel depuis VB6
    Par pcvesoul dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 21/09/2005, 15h52

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