Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Administration
Administration Forum d'entraide sur l'administration du serveur 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 05/04/2011, 14h36   #1
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Par défaut erreur ORA-1722 // NLS_NUMERIC_CHARACTERS

Bonjour à tous,

J'ai un soucis dans une de mes scripts de chargement de données.
J'ai un fichier plat qui est composé de données devant être insérées dans une table paie. Malheureusement dans ce fichier mes montants sont renseignés avec un . comme séparateur décimal et non une virgule, et j'ai donc une erreur-1722.

Après quelques recherches j'ai cru comprendre que le problème venait de nls_numeric_characters.

Lorsque je fais un select * from nls_database_parameters;
J'ai bien ., dans nls_numeric_characters
Je ne l'avais pas quand je faisais un select * from nls_session_parameters
Je me suis dis chouette le problème doit certainement venir de là, mais après changement j'ai toujours un soucis.

Je me suis ensuite dis, bon il se peut que ce soit le système (unix) sur lequel je lance mon script qui pose soucis, alors j'ai essayé de mettre une variable d'environnement en faisant un set NLS_NUMERIC_CHARACTERS=.,
Maintenant, quand je fais un set je vois bien ma ligne qui apparait, en revanche si je fais un echo $NLS_NUMERIC_CHARACTERS je ne vois aucune valeur qui s'affiche.

Je me suis dis, bon c'est pas grave je vais passer par le fichier directement, et dans mon script j'ai donc écrit ça :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#/******************************************************************************/
echo "Chargement de la table AGENT_PAIE" >>${INIT}
#/******************************************************************************/
export NLS_NUMERIC_CHARACTERS=.,
nom_Bad=${TRACES}/install/AGENT_PAIE.bad
nom_Log=${TRACES}/install/AGENT_PAIE.log
nom_Ctl=${INSTALL}/ctl/AGENT_PAIE.ctl
#bcp xxxxxxxx.dbo.AGENT_PAIE in $ALIMINIT/AGENT_PAIE_BCP.out -c -t; -r \\n  -U$xxxx -P$xxxx
sqlldr $Ixxxx$xxxx@//xxxxxxx:xxxx/xxxxxx control=${nom_Ctl} log=${nom_Log} bad=${nom_Bad}  
echo " ">>${INIT} 
IF [ -f ${nom_Bad} ]
	then
			echo "Le chargement a echoué, la log est la suivante : ">>${INIT}
			cat ${nom_Log} >>${INIT}
else
	tps=`date +" à %Hh%Mmn"`
	echo "Fin de chargement" $tps >>${INIT}
fi
echo " ">>${INIT} 
exit 0
Mais malheureusement ça ne fonctionne toujours pas, je dois mal m'y prendre quelque part mais je ne vois pas ou ..
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 16h07   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
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 311
Points : 5 808
Points : 5 808
Peut être un soucis avec vos données ?

Table t_nls
Code :
1
2
3
4
5
6
7
 
SQL> CREATE TABLE t_nls (
  2    a        number(15,2),
  3    b        number(15,2),
  4    c        varchar2(10)
  5  )
/
Fichier T_nls.ctl
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
LOAD DATA
INFILE "t_nls.csv"
REPLACE
INTO TABLE T_NLS
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
A "DECODE(:A,NULL,NULL,:A)",
B "DECODE(:B,NULL,NULL,:B)",
C "LTRIM(RTRIM(:C))"
)
Fichier t_nls.csv

Code :
1
2
12.25,20.34,TOTO
14.52,12.55,TITI
Variable NLS_NUMERIC_CHARACTERS

Code :
1
2
 
echo $NLS_NUMERIC_CHARACTERS
Fichier script t_nls
Code :
1
2
3
 
#export NLS_NUMERIC_CHARACTERS=.,
sqlldr mni/mni control=t_nls
Fichier t_nls.log
Code :
1
2
3
4
5
6
7
8
 
...
Enregistrement 1 : Rejeté - Erreur sur TABLE T_NLS, colonne A.
ORA-01722: Nombre non valide
 
Enregistrement 2 : Rejeté - Erreur sur TABLE T_NLS, colonne A.
ORA-01722: Nombre non valide
...
Fichier script t_nls
Code :
1
2
3
 
export NLS_NUMERIC_CHARACTERS=.,
sqlldr mni/mni control=t_nls
Fichier log
Code :
1
2
3
4
5
 
...
TABLE T_NLS :
  Chargement réussi de 2 Lignes.
...
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/04/2011, 10h05   #3
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Bonjour mnitu et merci de ton retour !

Finalement, j'ai opté pour une autre solution, j'ai simplement utilisé la fonction to_number dans mon ctl et ça fonctionne correctement.

Par contre, je suis en train d'appliquer la même chose pour mes dates, mais j'ai un soucis, lorsque j'ai des dates, ça s'insère correctement, par contre, mes lignes sans date me rejète une erreur.

Je vais chercher afin de trouver une solution et si je la trouve je la mettrais ici !

Encore merci,
NarbOni
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 17h02   #4
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Finalement, j'ai un autre soucis et plutot que d'ouvrir plusieurs topics je le poste ici.
Avec ma fonction to_number(:monchamp,999999999.99,nls_numeric_characters='.,'); j'ai tout de même un soucis, c'est que je n'arrive pas à forcer l'affichage de la décimale de mes nombres entiers.

Exemple : si j'ai 55.00 dans mon fichier plat, lors de l'affichage il va me mettre 55.

Je le vois en faisant un simple test select 55.00 from dual;
Savez-vous ou est ce qu'on peut paramétrer ce "forçage" d'affichage ?

Merci,
NarbOni
NarbOni 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 01h51.


 
 
 
 
Partenaires

Hébergement Web