Conversion de type char en type number dans sql loader

Fermé
sabdoul - 28 févr. 2013 à 18:22
sabdoul Messages postés 40 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 22 octobre 2014 - 1 mars 2013 à 13:39
Bonsoir, j'ai une préoccupation depuis quelques 2 jours et ça commence a bien faire donc j'ai besoin de votre aide.
j'ai des données de type chaine de caractère dans le fichier plat et je les les convertir en
type number avant leurs insertion dans ma BDD oracle a travers sql loader car ils sont
déclarés avec le type number mais j'ai cette erreur
ORA-00604: une erreur s'est produite au niveau SQL récursif 1
ORA-01722: Nombre non valide

voici mon fichier de controle

LOAD DATA
APPEND
INTO TABLE ma table
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
(CETABL char(5) ,
COPRODUIT char(35) ,
DESIG char(128),
QUANTITE QUANTITE "TO_NUMBER(:QUANTITE,'999G999D99')"
MONTANT_HT "TO_NUMBER(:MONTANT_HT,'999G999G999')",
MONTANT_TTC "TO_NUMBER(:MONTANT_TTC,'999G999G999')"
DATE Date "DD/MM/YYYY"
)
j'ai essayé en ajoutant les NLS_NUMERIC_CHARACTERS mais rien a faire.

voici comment se présente mes données

212;1101411;MAXIMOUSSE 24 NEW BLOH;120,00; 50 160;59 189;01/01/2013
212;1101411;MAXIMOUSSE 24 NEW BLOH;1 080,00;368 010;368 010;01/01/2013
212;1102101;BF4 BLOH X 36 MX;-2 520,00;-745 200;-879 336;01/01/2013
212;1102101;BF4 BLOH X 36 MX;2 520,00;686 980;686 980;01/01/2013
212;1102103;BF 8 580 GR X 24 MX;720,00;363 090;363 090;01/01/2013

je précise qu'il un separateur d'espace entre les milliers et c'est pour cela que j'utilise G pour l'indiquer.

j'espère que j'ai été plus précis et merci de vouloir m'aider

4 réponses

jee pee Messages postés 39637 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 avril 2024 9 235
28 févr. 2013 à 21:42
Salut,

Tu devrais essayer quelque chose comme :

SELECT TO_NUMBER('-2 520,00', '999G999D99',
'NLS_NUMERIC_CHARACTERS = '', ''') FROM DUAL;

cdlt
0
sabdoul Messages postés 40 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 22 octobre 2014
1 mars 2013 à 09:45
bonjour, concernant cette solution je pense qu'elle s'effectue dans une requête. hors mon cas c'est l'insertion des données provenant du fichier dans ma BDD a travers sql loader. donc je sais pas s'il une syntaxe spécifique de conversion de chaine de caractère en nombre dans le fichier de contrôle. si oui comment se présente elle.
du genre

LOAD DATA
APPEND
INTO TABLE ma table
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
(CETABL char(5) ,
COPRODUIT char(35) ,
DESIG char(128),
QUANTITE "TO_NUMBER(:QUANTITE,'999G999D99')"
MONTANT_HT "TO_NUMBER(:MONTANT_HT,'999G999G999')",
MONTANT_TTC "TO_NUMBER(:MONTANT_TTC,'999G999G999')",
DATE Date "DD/MM/YYYY"
)

qu'est ce qu'il faut adapter a ces lignes pour que ça marche car j'ai essayer plusiers syntaxe mais rien n'y faire ça ne marche pas

QUANTITE QUANTITE "TO_NUMBER(:QUANTITE,'999G999D99')"
MONTANT_HT "TO_NUMBER(:MONTANT_HT,'999G999G999')",
MONTANT_TTC "TO_NUMBER(:MONTANT_TTC,'999G999G999')"

merci d'avance
0
jee pee Messages postés 39637 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 avril 2024 9 235
Modifié par jee pee le 1/03/2013 à 13:29
sur la logique du to_number du select ce devrait être :

  
"TO_NUMBER (:QUANTITE,'999G999D99','NLS_NUMERIC_CHARACTERS = '', ''')"


attention aux simples cote ' et aux doubles cotes "


Un étranger, c'est un ami qu'on n'a pas encore rencontré.
0
sabdoul Messages postés 40 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 22 octobre 2014
1 mars 2013 à 13:39
Bonjour, j'avais déjà essayer cela et je viens de l'essayer encore mais ça ne marche pas c'est toujours la même erreur
Enregistrement 1 : Rejeté - Erreur sur table ma table.
ORA-00604: une erreur s'est produite au niveau SQL récursif 1
ORA-01722: Nombre non valide

voici la syntaxe
QUANTITE "TO_NUMBER(:QUANTITE,'999G999D99','NLS_NUMERIC_CHARACTERS = '', ''') ",
MONTANT_HT "TO_NUMBER(:MONTANT_HT,'999G999G999','NLS_NUMERIC_CHARACTERS = '', ''')",
MONTANT_TTC "TO_NUMBER(:MONTANT_TTC,'999G999G999','NLS_NUMERIC_CHARACTERS = '', ''')"

même en mettant des . a la place des , ou en les inter-changeant ça ne fonctionne pas.
0