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

PL/SQL Oracle Discussion :

Erreur ORA-01438 sur Update


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 114
    Par défaut Erreur ORA-01438 sur Update
    Bonjour,

    J'ai une erreur ORA-01438 que je n'arrive pas à comprendre. J'ai 2 champs numériques:
    . un de 38 chiffres et 9 décimales.
    . un de 38 chiffres et 15 décimales.

    Quand j'enregistre un très grand chiffre dans le premier, c'est OK, par contre j'ai une erreur quand j'enregistre dans le second.
    Quelqu'un aurait-il une idée ?

    Mon code de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE TEST_ORA_1438 (id NUMBER(10), champ_38_9 NUMBER(38,9), champ_38_15 NUMBER(38,15));
    INSERT INTO TEST_ORA_1438 (id) VALUES (10);
    COMMIT;
     
    UPDATE TEST_ORA_1438 SET champ_38_9 = 710000688022112000000000000 WHERE id = 10; -- OK
    UPDATE TEST_ORA_1438 SET champ_38_15 = 710000688022112000000000000 WHERE id = 10; -- KO

  2. #2
    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
    Attention NUMBER(38,15) correspond à Number 38 dont 15 décimales

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 114
    Par défaut
    Merci,

    J'étais en train de relire la documentation sur NUMBER et effectivement il faut retrancher le nombre de décimales à la précision.

    Du coup, existe-il une solution pour stocker de grand chiffres avec beaucoup de décimales ?

  4. #4
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    961
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 961
    Par défaut
    Bonjour

    Citation Envoyé par r038tmp5 Voir le message
    J'étais en train de relire la documentation sur NUMBER et effectivement il faut retrancher le nombre de décimales à la précision.
    En soit c'est une bonne chose

    Citation Envoyé par r038tmp5 Voir le message
    Du coup, existe-il une solution pour stocker de grand chiffres avec beaucoup de décimales ?
    une solution est d'utiliser les types à virgules flotantes
    BINARY_FLOAT ; Range of +/3.4E+38 ; Precision of 6-7 digits ; Require 4 bytes.
    BINARY_DOUBLE ; Range of +/1.7E+308 ; Precision of 15 digits ; Requires 8 bytes.

    Une autre est d'utiliser 2 colonnes NUMBER : 1 pour la partie entière et l'autre pour la partie décimale, sachant qu'on ne peut les additionner entre eux (dépassement de type sans perte de précision) et donc l'affichage passe par une concaténation (et donc de type varchar() )

  5. #5
    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
    Tu peux déclarer en NUMBER simple (38 chiffres) sans fixer de précision
    Si tu as besoin de plus de 38 chiffres, alors là je ne sais pas comment stocker ça dans une seule colonne de la base.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE wmc (a number)
     
    INSERT INTO wmc VALUES(710000688022112000000000000);
     
    INSERT INTO wmc VALUES(710000688022112000000000000.0123456789);
     
    SELECT * FROM wmc
     
    A
    710000688022112000000000000
    710000688022112000000000000.0123456789

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 114
    Par défaut
    Merci pour vos réponses.

    J'ai fait des essais avec BINARY_FLOAT et BINARY_DOUBLE, il y a des limites et il y a des arrondis qui se font à l'affichage.
    La meilleure solution semble de configurer le champ à NUMBER(38) et contrôler nous même que l'application ne permet par d'enregistrer des nombres de plus de 38 digits.

Discussions similaires

  1. Erreur ORA-04031 sur connexion sqlplus
    Par bigorj dans le forum Connexions aux bases de données
    Réponses: 9
    Dernier message: 28/08/2007, 12h18
  2. Erreur ORA-12560 sur un Export
    Par genio dans le forum Oracle
    Réponses: 6
    Dernier message: 16/01/2006, 17h21
  3. Erreur ORA-01555 sur un select
    Par LRI dans le forum Oracle
    Réponses: 2
    Dernier message: 13/05/2005, 10h42
  4. Erreur ORA-04082 sur un trigger
    Par elcaro92 dans le forum Oracle
    Réponses: 2
    Dernier message: 31/01/2005, 21h30
  5. Erreur ORA-01036 sur un XMLGRAM
    Par sch dans le forum XMLRAD
    Réponses: 5
    Dernier message: 07/09/2004, 14h56

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