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 :

[11g] Précision SELECT ou affichage ?


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 41
    Par défaut [11g] Précision SELECT ou affichage ?
    Bonsoir,

    Sous TOAD je me connecte à une base Oracle 11g et j'exécute le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create table toto (toto number(38,28));
     
    insert into toto (toto) values (123.12345678901234567 );
    commit;
     
    select toto , to_char(toto) from toto;
    Voici le résultat obtenu :
    123.123456789012 | 123,12345678901234567
    Donc en base les 17 chiffres après la virgule sont bien présents (puisque le to_char les restitue bien). Mais quand on l'affiche avec un select il n'y en a plus que 12 (il arrondi à la 12ième décimal et nous l'affiche).

    C'est embétant parce que lorsque j'exécute cette même requete depuis mon ETL le comportement est identique. Donc au lieu de manipuler dans les traitements un réel avec 17 décimal, l'ETL ne travaille qu'avec 12 décimal...

    Est ce qu'il y a un paramétrage de la base Oracle à faire pour que le SELECT n'arrondisse pas et remonte le nombre avec toutes ses décimales ?

    Ou quelqu'un aurait il une autre piste sous Oracle ?

    Merci d'avance

  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
    Que donne un dump de toto ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT toto , dump(toto), to_char(toto) FROM toto;

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 41
    Par défaut
    Citation Envoyé par McM Voir le message
    Que donne un dump de toto ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT toto , dump(toto), to_char(toto) FROM toto;
    Merci pour ta réponse. Voici le résultat obtenu :

    toto =123.123456789012
    dump(toto) = 'Typ=2 Len=12: 194,2,24,13,35,57,79,91,13,35,57,71'
    to_char(toto) = 123,123456789012345674567

    Et j'obtiens le même résultat avec
    SELECT toto , dump(toto,10), to_char(toto) FROM toto
    et
    SELECT toto , dump(toto,1010), to_char(toto) FROM toto

    Je ne sais pas si je lis bien le résultat de cette fontion m'ais j'en déduis que sa longueur est sur 12 bytes. Je ne sais pas quelle longueur en caractère cela donne... Par ailleurs je ne comprends pas pourquoi le fait de rajouter le second paramètre ne me formate pas la sortie en nombre décimal.

  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
    J'ai le même dump sous 9i, par contre mon select sous toad me ramène bien tous les chiffres.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 41
    Par défaut
    Citation Envoyé par McM Voir le message
    J'ai le même dump sous 9i, par contre mon select sous toad me ramène bien tous les chiffres.
    A ton avis pourrait il s'agir d'un paramètrage de la base de données ?

    De toute façon ca n'est pas un problème de stockage en base. C'est un problème de récupération de la donnée.

  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
    Surement un bug de la version 11. Vérifie sur Oracle Support et ouvre un SR si nécessaire.
    recherche "precision loss", tu trouveras quelques bugs corrigés dans des patchs.
    exemple le n° 7489902

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Je ne pense pas qu'il s'agit d'un quelconque bug
    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
     
    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
     
    SQL> select toto from toto;
     
          TOTO
    ----------
    123,123457
     
    SQL> col toto format 999D9999999999999999999999999999
    SQL> r
      1* select toto from toto
     
                                 TOTO
    ---------------------------------
     123,1234567890123456700000000000
     
    SQL>

  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
    Oui mais là, t'es sous sql+, c'est pas le top niveau rendu d'affichage.
    "col toto format 999D9999999999999999999999999999" est une commande spécifique sqlplus
    lc2etc parle de toad et de son ETL.

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Ça doit être du paramétrage dans TOAD mais il faut trouver où, j'ai regardé un peu mais je n'ai pas trouvé.

    Ce qui est amusant dans TOAD, ou plutôt perturbant, c'est qu'en exécutant la requête unitairement (sélection + F9) :
    TOTO                    TO_CHAR(TOTO)
    ----------------------- ---------------------
    123.12345678901234567   123,12345678901234567
    En lançant en tant que script (sélection + F5) :
          TOTO TO_CHAR(TOTO)                           
    ---------- ----------------------------------------
    123.123457 123.12345678901234567                   

  10. #10
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par McM Voir le message
    Oui mais là, t'es sous sql+, c'est pas le top niveau rendu d'affichage.
    "col toto format 999D9999999999999999999999999999" est une commande spécifique sqlplus
    lc2etc parle de toad et de son ETL.
    Sqlplus, Toad ou autre outil qu’est-ce que ça change ?

  11. #11
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut,

    Du même avis que Mnitu, mais pas de preuve ultime.

    Quand tu demandes l'affichage, c'est un paramètre du client.
    SQL*Plus : col format
    Grid Toad : ??
    => A priori, on peut se dire que ce sont les mêmes données brutes qui sont transférées ?

    D'ailleurs, quand dans toad tu exécutes avec F5, c'est exécuté en SQL*Plus (tu peux ajouter un col toto format(...) dans ta sélection Waldar).

    Un truc à tenter, c'est de binder le select avec un autre langage (genre java), sur un type de données côté client assez gros, et utiliser une routine du client pour afficher.

    Concernant l'ETL, c'est peut être dans l'étape intermédiaire "ETL" que tu perds la précision ? (Une variable intermédiaire trop petite dans l'outil ?)

  12. #12
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Une fois le plan élaboré Oracle va aller dans un bloc des données identifier l'enregistrement en question et va lire la séquencé des octets qui est mise en évidence par la fonction dump.
    Si la commande est issue d'un outil comme sqlplus ou Toad etc. cette suite des octets représentant une valeur numérique est transformée dans une chaine des caractères lisible par l'opérateur humain, en utilisant éventuellement quelques paramètres qui gèrent l'affichage (numwidth, numformat, column sous sqlplus).
    Et si cette même requête est exécuté par un langage de programmation 3G genre java ou c?
    Dans ce cas il faut bien s'appeler qu'il y a une différence entre la précision que Oracle est capable de gérer et celle des variables numériques (float double) du langage choisies comme cible d'affectation

  13. #13
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 41
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Concernant l'ETL, c'est peut être dans l'étape intermédiaire "ETL" que tu perds la précision ? (Une variable intermédiaire trop petite dans l'outil ?)
    Salut,
    L'ETL utilisé est Informatica. L'objet (SQ) interroge juste la base et celle-ci lui remonte directement le champ mais pas avec toute la précision. Il n'y a aucune variable ou traitement intermédiaire.

  14. #14
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 41
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Une fois le plan élaboré Oracle va aller dans un bloc des données identifier l'enregistrement en question et va lire la séquencé des octets qui est mise en évidence par la fonction dump.
    Si la commande est issue d'un outil comme sqlplus ou Toad etc. cette suite des octets représentant une valeur numérique est transformé dans une chaine des caractères lisible par l'opérateur humain, en utilisant éventuellement quelques paramètres qui gèrent l'affichage (numwidth, numformat, column sous sqlplus).
    Et si cette même requête est exécuté par un langage de programmation 3G genre java ou c?
    Dans ce cas il faut bien s'appeler qu'il y a un différence entre la précision que Oracle est capable de gérer et celle des variables numériques (float double) du langage choisies comme cible d'affectation.
    Je n'ai pas tout compris lol. Mais bon, la variable numerique sous informatica est paramétrable comme bon nous sembles pour affecter la précision exacte souhaitée. Et je l'ai définie de façon identique à ORACLE c'est à dire 17 précisions. En fait j'ai constaté que le problème apparaissait avec l'affectation sous Informatica. C'est vraiment ce qui est envoyé par oracle qui pose problème.

    Par contre dump(toto) = 'Typ=2 Len=12:194,2,24,13,35,57,79,91,13,35,57,71'

    Est ce que Len représente la longueur ?

  15. #15
    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
    len représente la longueur du codage interne
    Chaque nombre (en dehors du 194) représente 2 chiffres. Le second est égal au chiffre + 1

    194,2,24,13,35,57,79,91,13,35,57,71
    02 24 13 35 57 79 91 13 35 57 71
    01 23 12 34 56 78 90 12 34 56 70

    tu retrouves ton nombre
    123.12345678901234567

  16. #16
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    C'est quand même un problème client, donc informatica
    Utilisez vous le mode High precision ?
    http://www.element61.be/e/resourc-de...?ResourceId=57
    High precision
    The high precision mode will allow using decimals up to a precision of 28 digits. Using this kind of precision will result in a performance penalty in reading and writing data. It is therefore recommended to disable high precision when not really needed. When turned off, decimals are converted to doubles that have a precision up to 15 digits.

  17. #17
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 41
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    C'est quand même un problème client, donc informatica
    Utilisez vous le mode High precision ?
    http://www.element61.be/e/resourc-de...?ResourceId=57
    Oui j'ai déjà activé l'option High precision

  18. #18
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 41
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    C'est quand même un problème client, donc informatica
    Utilisez vous le mode High precision ?
    http://www.element61.be/e/resourc-de...?ResourceId=57
    Pourquoi pensez vous qu'il s'agisse d'un problème du client ?

  19. #19
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Citation Envoyé par lc2ms1978 Voir le message
    Pourquoi pensez vous qu'il s'agisse d'un problème du client ?
    Les différents exemple sur toad et sqlplus le montre, et pour informatica ça peut être un problème de conversion implicite comme le mentionnait mnitu.

    Quelques recherches montrent qu'en fonction de la version d'informatica il y a une limitation sur le type decimal à 28 :
    https://community.informatica.com/thread/22623
    http://datawarehouse.ittoolbox.com/g...nscale-1748043

    Je ne connais pas informatica mais je pense qu'il faut chercher dans ce sens.
    La colonne number(38,28) est elle réellement correctement dimensionnée ?

  20. #20
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 41
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    La colonne number(38,28) est elle réellement correctement dimensionnée ?
    En tous cas moi je l'ai définit de la sorte aussi bien sous oracle qu'informatica.

Discussions similaires

  1. Requète select et affichage des données.
    Par morgan47 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 06/10/2009, 09h09
  2. <html:select> pb affichage liste
    Par Melaba dans le forum Struts 1
    Réponses: 14
    Dernier message: 01/08/2008, 16h19
  3. [Spring Portlets] select paramétré+affichage jsp
    Par myriam818 dans le forum Spring Web
    Réponses: 0
    Dernier message: 06/12/2007, 17h42
  4. Pb requete select et affichage datas
    Par lorderon85 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/01/2007, 17h57
  5. [MySQL] select avec affichage conditionnel
    Par encoupe dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 31/10/2005, 23h46

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