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- 01401 Debug


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Points : 8
    Points
    8
    Par défaut ORA- 01401 Debug
    Bonjour,

    j'ai un soucis d'insertion dans une table et l'erreur retournée est ORA-01401. J'ai de temps en temps une ligne qui ne s'insère pas. Je me suis renseigné sur le net, et la thèse la plus probable serait celle des charactersets... Sauf que mes données sont de taille fixe et contiennent les même caractères. Bref en comparant les data et la largeur de colonnes, il n'y a pas de problème apparant, mieux encore, les requêtes qui foirent passent sans soucis sous Toad, PL/SQL et SQL+ (j'ai tout essayé...).

    Quelqu'un aurait-il une idée, ou au moins un trigger ou une fonction à me proposer pour identifier la colonne qui ne passe pas (car je ne suis pas du tout un pro de la prog en Oracle...).

    Merci beaucoup de me passer un coup de main si vous avez des idées, je suis sur le problème depuis 3 jours et j'en vois pas vraiment le bout...
    ++
    Stongolm

  2. #2
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Soit le problème vient effectivement d'un problème de character set, soit tout simplement vous essayez d'insérer 8 caractères dans une chaine de 5 !

    Pour éliminer le problème du jeu de caractère, faites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select parameter, value
      from nls_database_parameter
     where Parameter = 'NLS_CHARACTERSET';
    Un jeu d'essai pour valider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    create table ttest (col1 varchar2(9 char) );
    insert into ttest (col1) values ('Telephone');
    insert into ttest (col1) values ('Téléphone');
    après, pour identifier l'instruction SQL, vous devez tracer l'activité des sessions ! ;-)

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Le Character Set de la base est WE8ISO8859P9 (avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM sys.props$ WHERE name LIKE 'NLS%CHARACTERSET%'
    ).

    Le soucis, c'est que j'ai le problème avec deux tables. Je me penchai au début sur une colonne contenant des raws (créés à partir d'une string de taille déterminée par un substr), mais finalement je suis passé sur une autre qui est commune aux deux tables (un to_char d'une séquence de forme '000000'). Dans les deux cas, la taille ne devrait pas varier.

    L'idéal serait déjà de pouvoir tracer les insertions pour trouver la ou les colonnes incriminées...Comme je l'ai dit plus haut, les traces et les insertions "à la main" ne montrent aucun soucis...

    Merci pour la réponse !

  4. #4
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Vous avez un CS ISO, donc aucun souci de ce côté là !

    C'est donc que vous cherchez tout simplement à insérer des données plus grandes que la colonne ne le permet !

    Si vous tracez la requête qui provoque l'erreur...

  5. #5
    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
    Points : 4 926
    Points
    4 926
    Par défaut
    essaye éventuellement le logging d'erreur DML (10gR2)

    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
     
    SQL> create table t(x char);
     
    Table created.
     
    SQL> exec dbms_errlog.create_error_log('T');
     
    PL/SQL procedure successfully completed.
     
    SQL> insert into t values ('123') log errors;
    insert into t values ('123') log errors
                          *
    ERROR at line 1:
    ORA-12899: value too large for column "SCOTT"."T"."X" (actual: 3, maximum: 1)
     
     
    SQL> select * from err$_t;
    ORA_ERR_NUMBER$ ORA_ERR_MESG$                         ORA_ERR_ROWID$ O X
    --------------- ------------------------------------- -------------- - -----
              12899 ORA-12899: value too large for column                I 123

  6. #6
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Argh, ç'aurait été nickel mais j'ai la version 8i... Mais c'est tout à fait ce que je cherche....)

  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
    Points : 4 926
    Points
    4 926
    Par défaut
    dans ce cas une procedure avec exception

    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
     
    SQL> create table t1 as select 'x' x from dual union all select 'zzz' x from dual;
     
    Table created.
     
    SQL> create table t(x char);
     
    Table created.
     
    SQL> insert into t select * from t1;
    insert into t select * from t1
                         *
    ERROR at line 1:
    ORA-12899: value too large for column "SCOTT"."T"."X" (actual: 3, maximum: 1)
     
    SQL> set serverout on
    SQL> declare pragma autonomous_transaction; begin for c in (select * from t1) loop begin insert into t values (c.x); exception when others then dbms_output.put_line('x='||c.x); end; end loop; rollback; end;
      2  /
    x=zzz
     
    PL/SQL procedure successfully completed.

  8. #8
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Je teste ça dès que possible, merci bien !

  9. #9
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Points : 8
    Points
    8
    Par défaut

    ça passe pas l'idéal serait juste d'avoir la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-12899: value too large for column "SCOTT"."T"."X" (actual: 3, maximum: 1)
    en retour
    N'y-a-t'il pas un moyen plus simple ? Je fais des tentatives mais bon ... c'est un peu foireux...

  10. #10
    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
    Points : 4 926
    Points
    4 926
    Par défaut
    tu peux ajouter sqlerrm dans ton output

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 38
    Points : 69
    Points
    69
    Par défaut
    Bonjour !

    Après une recherche sur le sujet j'ai préférré déterrer ce thread plutôt que d'en créer un autre.
    Alors voilà mon problème est de détecter quelle colonne est fautive lorsqu'une erreur 1401 arrive. La solution est dans ce thread, cf la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ORA-12899: value too large for column "SCOTT"."T"."X" (actual: 3, maximum: 1)
    Mon problème est simple, comment obtenir cette ligne ? Je n'ai pas autant de détail, chez moi les messages d'erreurs ressemblent plus à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-1401: inserted value too large for column
    Alors comment avoir un message plus détaillé comme au dessus ? Je remarque que bizarrement le numéro d'erreur n'est pas 1401 ? Peut être est du à la version d'oracle (je suis sous 9.2.0.4) ?

  12. #12
    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
    Citation Envoyé par RegBas
    Alors comment avoir un message plus détaillé comme au dessus ? Je remarque que bizarrement le numéro d'erreur n'est pas 1401 ? Peut être est du à la version d'oracle (je suis sous 9.2.0.4) ?
    Si ça peut vous aider, j'ai effectué 2 tests :
    - en 8.1.7.4.0 : ORA-01401 avec peu d'explications
    - en 10.1.0.3.0 : ORA-12899 avec toutes les explications

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 38
    Points : 69
    Points
    69
    Par défaut
    Je viens aussi de me rendre compte que suivant le type du champ l'erreur n'est pas la même.
    L'erreur 1401 je l'obtiens avec un type VARCHAR2.
    Pour un champ de type numérique par exemple, une valeur trop grande provoquera l'erreur 1438.

    Mais pas de détail pour l'une ou l'autre :/

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/04/2011, 17h15
  2. ORA-01401 : inserted value too large for column
    Par Mattgic dans le forum Oracle
    Réponses: 5
    Dernier message: 25/05/2010, 10h18
  3. [Sql] Insert et ORA-01401
    Par madina dans le forum Oracle
    Réponses: 7
    Dernier message: 03/08/2006, 20h33
  4. [Imp] ORA-01401
    Par genio dans le forum Oracle
    Réponses: 11
    Dernier message: 19/07/2006, 17h32
  5. Doc sur Debug de Ms-Dos
    Par gtr dans le forum Assembleur
    Réponses: 13
    Dernier message: 23/09/2003, 09h06

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