Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/02/2012, 18h27   #1
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 10
Points : 0
Points : 0
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 :
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 :
Citation:
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
lc2ms1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 22h03   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 448
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 448
Points : 4 194
Points : 4 194
Que donne un dump de toto ?
Code :
SELECT toto , dump(toto), to_char(toto) FROM toto;
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 10h30   #3
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 10
Points : 0
Points : 0
Citation:
Envoyé par McM Voir le message
Que donne un dump de toto ?
Code :
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.
lc2ms1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 11h02   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 448
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 448
Points : 4 194
Points : 4 194
J'ai le même dump sous 9i, par contre mon select sous toad me ramène bien tous les chiffres.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 12h33   #5
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 10
Points : 0
Points : 0
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.
lc2ms1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 13h17   #6
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 448
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 448
Points : 4 194
Points : 4 194
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
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 14h14   #7
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 316
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 316
Points : 5 822
Points : 5 822
Je ne pense pas qu'il s'agit d'un quelconque bug
Code :
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>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 14h40   #8
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 448
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 448
Points : 4 194
Points : 4 194
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.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 15h21   #9
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 688
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 688
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Ç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                   
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 15h42   #10
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 316
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 316
Points : 5 822
Points : 5 822
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 ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 17h16   #11
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
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 ?)
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 21h56   #12
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 316
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 316
Points : 5 822
Points : 5 822
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
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 11h04   #13
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 10
Points : 0
Points : 0
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.
lc2ms1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 11h12   #14
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 10
Points : 0
Points : 0
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 ?
lc2ms1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 11h20   #15
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 448
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 448
Points : 4 194
Points : 4 194
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
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/02/2012, 12h13   #16
Membre Expert
 
Inscription : août 2008
Messages : 1 274
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 274
Points : 1 934
Points : 1 934
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
Citation:
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.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 12h29   #17
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 10
Points : 0
Points : 0
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
lc2ms1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 12h31   #18
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 10
Points : 0
Points : 0
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 ?
lc2ms1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 14h21   #19
Membre Expert
 
Inscription : août 2008
Messages : 1 274
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 274
Points : 1 934
Points : 1 934
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 ?
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 15h00   #20
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 10
Points : 0
Points : 0
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.
lc2ms1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h24.


 
 
 
 
Partenaires

Hébergement Web