|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | |||
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 10 ![]() |
Bonsoir,
Sous TOAD je me connecte à une base Oracle 11g et j'exécute le code suivant : Code :
Citation:
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 |
|||
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 448 ![]() |
Que donne un dump de toto ?
Code :
SELECT toto , dump(toto), to_char(toto) FROM toto;
__________________
More Code : More Bugs. Less Code : Less Bugs |
|
|
00
|
|
|
#3 | |
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 10 ![]() |
Citation:
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. |
|
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 448 ![]() |
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 |
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 10 ![]() |
|
|
|
00
|
|
|
#6 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 448 ![]() |
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 |
|
|
00
|
|
|
#7 | ||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 316 ![]() |
Je ne pense pas qu'il s'agit d'un quelconque bug
Code :
|
||
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 448 ![]() |
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 |
|
|
00
|
|
|
#9 |
![]() ![]() |
Ç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 TOTO TO_CHAR(TOTO) ---------- ---------------------------------------- 123.123457 123.12345678901234567
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#10 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 316 ![]() |
|
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
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/ |
|
00
|
|
|
#12 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 316 ![]() |
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 |
|
|
00
|
|
|
#13 | |
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 10 ![]() |
Citation:
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. |
|
|
|
00
|
|
|
#14 | |
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 10 ![]() |
Citation:
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 ? |
|
|
|
00
|
|
|
#15 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 448 ![]() |
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 |
|
|
10
|
|
|
#16 | |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 274 ![]() |
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:
|
|
|
|
00
|
|
|
#17 | |
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 10 ![]() |
Citation:
|
|
|
|
00
|
|
|
#18 | |
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 10 ![]() |
Citation:
|
|
|
|
00
|
|
|
#19 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 274 ![]() |
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 ? |
|
|
00
|
|
|
#20 |
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 10 ![]() |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com