Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 14/04/2007, 23h01   #1
Nouveau Membre du Club
 
Inscription : mars 2005
Messages : 162
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 162
Points : 36
Points : 36
Par défaut [Oracle] comment faire un to_number sur un replace?

Bonjour,

J'ai une table externe qui possède un champs de type char contenant en fait un nombre d'habitants. Ne me demandez pas pourquoi, mais ce nombre est donné comme ceci: 123456789,00

Je veux créer une table a partir de ma table externe, qui prends ce champs en le transformant en Number.

Je me suis dit que ceci pouvait faire l'affaire:

Code :
1
2
INSERT INTO ma_table ( champ1, nbhabitants)
SELECT champ1, (to_number(REPLACE(nbhabitants,',','.'),'99999999999.99')) AS nbhabitants FROM ma_table_externe;
Il me renvoie cette erreur:

Code :
1
2
3
4
SELECT champ1, (to_number(REPLACE(nbhabitants,',','.'),'99999999999.99')) AS nbhabitants FROM ma_table_externe;
                          *
ERREUR à la ligne 2 :
ORA-01722: invalid number
Si je teste le select seul, il ne fonctionne pas avec le number, mais il me retourne bien 123456789.00 si je ne fais que le replace.

Savez vous ce qui peut être la cause de ce problème?

Merci de votre réponse
__________________
Qui osera affronter ma brute??
Si tu perds, rejoins mon clan
keumlebarbare est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2007, 23h46   #2
Nouveau Membre du Club
 
Inscription : mars 2005
Messages : 162
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 162
Points : 36
Points : 36
J'ai peut être trouvé la cause du problème:

Je tente de lui dire to_number(123..., ...) au lieu de to_number('123...',...)

Mais je n'arrive pas à concaténer avec des ' mon char, et il ne comprends pas "'" || nbhabitants!!!

De l'aide svp!
__________________
Qui osera affronter ma brute??
Si tu perds, rejoins mon clan
keumlebarbare est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2007, 09h16   #3
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
Modifiez plutôt vos paramètres NLS de façon à ce que le séparteur décimal soit correctement interprété au lieu de faire un usine à gaz qui sera lente, difficile à maintenir, illisible et potentiellement source de bugs !

Oracle a prévu la gestion des séparateurs. Utilisez-les !
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2007, 10h40   #4
Nouveau Membre du Club
 
Inscription : mars 2005
Messages : 162
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 162
Points : 36
Points : 36
Moi je veux bien, mais j'ai pas les droits pour modifier oracle.ini, meme un
Code :
ALTER SESSION SET NLS_NUMERIC_CHARACTERS='.,';
ne marche pas!


je ne comprends pas pourquoi il ne fonctionne pas!
__________________
Qui osera affronter ma brute??
Si tu perds, rejoins mon clan
keumlebarbare est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2007, 10h54   #5
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
marche pas.... ben voyons.. c'est très explicite !! :S

quel est le code erreur ?

que donne
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2007, 11h03   #6
Nouveau Membre du Club
 
Inscription : mars 2005
Messages : 162
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 162
Points : 36
Points : 36
le résultat de la requête que tu viens de me donner donne:

Code :
1
2
3
4
5
       9/2
----------
       4.5
 
1 ligne sélectionnée.

par contre, j'ai testé ceci:

Code :
SELECT to_number('100,00','999.99') FROM dual;
il me retourne:

Code :
1
2
3
4
SELECT to_number('100,00','999.99') FROM dual
                 *
ERREUR à la ligne 1 :
ORA-01722: invalid number
et

Code :
SELECT to_number('100.00','999.99') FROM dual;
il me donne:
Code :
1
2
3
4
5
6
 
TO_NUMBER('100.00','999.99')
----------------------------
                         100
 
1 ligne sélectionnée.

Le truc, c'est que si mon to number est sur 999,99, ca me transforme en entier fois 100 :/
__________________
Qui osera affronter ma brute??
Si tu perds, rejoins mon clan
keumlebarbare est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2007, 11h18   #7
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
Je vois pas où est le problème ?!

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
SQL> SELECT 9/2 FROM dual;
 
       9/2
----------
       4.5
 
SQL> SELECT to_number('3.14957') FROM dual;
 
TO_NUMBER('3.14957')
--------------------
             3.14957
 
SQL> SELECT to_number('3,14957') FROM dual;
SELECT to_number('3,14957') FROM dual
                 *
ERROR at line 1:
ORA-01722: invalid number
 
 
SQL> ALTER session SET nls_numeric_characters=', ';
 
Session altered.
 
SQL> SELECT 9/2 FROM dual;
 
       9/2
----------
       4,5
 
SQL>  SELECT to_number('3.14957') FROM dual;
 SELECT to_number('3.14957') FROM dual
                  *
ERROR at line 1:
ORA-01722: invalid number
 
 
SQL> SELECT to_number('3,14957') FROM dual;
 
TO_NUMBER('3,14957')
--------------------
             3,14957
quel message obtenez-vous sur le alter session ?
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2007, 11h25   #8
Nouveau Membre du Club
 
Inscription : mars 2005
Messages : 162
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 162
Points : 36
Points : 36
La session est modifiée, pas de souci de ce coté là, mais le truc, c'est que je charge des tables externes, dont certaines ont des , comme séparateur, et les autres des .

Cela ne règle donc pas mon problème

Je pensais que si je mettais en séparateur les , et . cela marcherait mais faut croire que non

edit:

Je viens de voir que ,. mettais en fait l'un comme séparateur décimal, et l'autre pour les milliers. Comment faire pour que l'un ou l'autre soit en décimal?
__________________
Qui osera affronter ma brute??
Si tu perds, rejoins mon clan
keumlebarbare est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2007, 12h12   #9
Nouveau Membre du Club
 
Inscription : mars 2005
Messages : 162
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 162
Points : 36
Points : 36
AAAAAAAAAAAAAAAAAAAAAAAAAH

J'ai trouvé l'erreur de screunieunieu!!

Mon collègue mais néanmoins ami a modifier le fichier que je récupère. la premiere ligne n'est plus une ligne de donnée, mais une ligne contenant le nom des champs!!!


Comment puis-je faire pour sauter le chargement de cettre premiere ligne dans ma table externe, je crois qu'il y a une fonction skip 1 qui fait un truc du style non?
__________________
Qui osera affronter ma brute??
Si tu perds, rejoins mon clan
keumlebarbare est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h39.


 
 
 
 
Partenaires

Hébergement Web