Bonjour,
J'ai lu tous les topics concernant ce souci, malheureusement quelque chose m'échappe.
Je lis qu'il faut setter la variable OS NLS_LANG, mais je n'ai pas accès à la machine, juste au dossier de travail me permettant de lancer SqlLoader, et de toute façon je ne saurais même pas où chercher Que dois-je demander au DBA ?
Concernant NLS_NUMERIC_CHARACTERS, je ne comprends pas comment l'utiliser, notamment au niveau de la définition du format.
Je vous montre mon cas :
Il s'agit de charger des noms, prénoms et age.
Quand la ligne commence par 1 je veux charger dans une table T_FILLES,
quand la ligne commence par 2 je veux charger dans une table T_GARCONS.
Fichier de données (les espaces et casses variables sont volontaires pour tester upper et trim) :
Fichier de contrôle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 1;DUPONT;JEANNE ;27 2;DUBOIS;PATRICK;30 1;marteau ;FRANCOISE;26 1;DE MACHIN; Michelle;28 2;DURAND;NICOLAS;29
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
20
21
22
23 LOAD DATA INFILE '/workfolder/my_data.dat' BADFILE '/workfolder/my_data.bad' APPEND PRESERVE BLANKS INTO TABLE T_FILLES when (1:1) = '1' FIELDS TERMINATED BY ';' TRAILING NULLCOLS ( NOM_FILLE "upper(trim(:NOM_FILLE))", PRENOM_FILLE "upper(trim(:PRENOM_FILLE))", AGE_FILLE ) INTO TABLE T_GARCONS when (1:1) = '2' FIELDS TERMINATED BY ';' TRAILING NULLCOLS ( NOM_GARCON "upper(trim(:NOM_GARCON))", PRENOM_GARCON "upper(trim(:PRENOM_GARCON))", AGE_GARCON )
Résultat :
Rien dans la table T_FILLES, et les ages des garçons insérés dans le champ NOM_GARCON de la table T_GARCONS.
1ere question : comment charger ces données dans ces 2 tables ?
Ensuite, j'ai simplifié mon fichier de contrôle pour ne travailler que sur la table T_FILLES à laquelle j'ai ajouté une colonne NUM qui insère bien les valeurs "1" histoire de ne pas avoir de souci avec cette colonne et de tester l'insertion des ages... :
C'est là que j'obtiens pour les 3 filles
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 LOAD DATA INFILE '/workfolder/my_data.dat' BADFILE '/workfolder/my_data.bad' APPEND PRESERVE BLANKS INTO TABLE T_FILLES when (1:1) = '1' FIELDS TERMINATED BY ';' TRAILING NULLCOLS ( NUM, NOM_FILLE "upper(trim(:NOM_FILLE))", PRENOM_FILLE "upper(trim(:PRENOM_FILLE))", AGE_FILLE "TO_NUMBER(:AGE_FILLE, '0d0','NLS_NUMERIC_CHARACTERS=''.,''')" )
Record 1: Rejected - Error on table CONFO.T_FILLES, column AGE_FILLE.
ORA-01722: invalid number
(idem Record 3 et Record 4)
En lisant les différents topics j'ai lancé les requêtes permettant de vérifier le NLS_NUMERIC_CHARACTERS :
--> Résultat : 1.2
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT to_number('1.2') FROM dual;
--> Résultat : invalid number
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT to_number('1,2') FROM dual;
--> Résultat : 1.2
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT to_number ('1.2', '9999999999999D9999999999', 'NLS_NUMERIC_CHARACTERS=''. ''') FROM dual;
J'en déduis que le NLS_NUMERIC_CHARACTERS est bien un point non ?..
2eme question : dois-je intervenir qqpart pour ce souci de nombre ? Pourquoi cela ne fonctionne pas ?
Je lis qu'il faut setter la variable OS NLS_LANG, mais je n'ai pas accès à la machine, juste au dossier de travail me permettant de lancer SqlLoader, et de toute façon je ne saurais même pas où chercher Que dois-je demander au DBA ?
Concernant NLS_NUMERIC_CHARACTERS, je ne comprends pas comment l'utiliser, notamment au niveau de la définition du format. Je vois bien que mettre '0d0' stockerai les age sous la forme 29.0, mais si je ne veux pas de décimale ?
D'avance merci à tous
Partager