IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL*Loader Oracle Discussion :

Invalid number, NLS_NUMERIC_CHARACTERS et chargement multitables


Sujet :

SQL*Loader Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut Invalid number, NLS_NUMERIC_CHARACTERS et chargement multitables
    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) :

    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
    Fichier de contrôle

    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... :

    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=''.,''')" 
    )
    C'est là que j'obtiens pour les 3 filles
    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 :

    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') FROM dual;
    --> Résultat : invalid number
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT to_number ('1.2', '9999999999999D9999999999', 'NLS_NUMERIC_CHARACTERS=''. ''') FROM dual;
    --> Résultat : 1.2

    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

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 175
    Par défaut
    Pour NLS_NUMERIC_CHARACTERS, le premier caractère représente le séparateur décimal, et le second caractère représente le séparateur des milliers
    Pour ton problème d'âge, je ne comprends pas trop ton problème : si les âges sont entiers, pourquoi tu t'embêtes à faire du formattage ?
    Dans ta table pour le champ AGE tu met un entier, et dans ton fichier de contrôle pas besoin de spécifier quoique ce soit dans le formattage, il va se débrouiller tout seul, comme tu le fais déjà avec ton champ "NUM"

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Merci Couak !

    Pour l'instant je travaille avec une table simple pour me familiariser avec Sql Loader mais après j'aurais des nombres à décimales à charger.
    OK pour l'age, c'est en effet ce qui se passe déjà.

    Je vais tester avec des décimales.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Ca plante avec des décimales

    Fichier de données (au passage la conversion en majuscule de Michèle me donne MICH¿LE )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1;DU-PONT;JEANNE       ;27; 04091981 ; 1.548771
    2;DUBOIS;PATRICK;30;29051979; 2.65871
    1;marteau.plouf   ;FRANCOISE;26;04111982; 0.998
    1;D'MACHIN;  Michèle;28;16051980;4.25487
    2;DURAND;NICOLAS;29;13011980;1.3654
    Fichier de controle :
    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
     
    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,
    	DDN_FILLE "TO_DATE (:DDN_FILLE,'DDMMYYYY')",
    	TAUX_CHANGE "TO_NUMBER(:TAUX_CHANGE, '0d000000','NLS_NUMERIC_CHARACTERS=''.,''')"
    )

    Erreur :

    Record 1: Rejected - Error on table T_FILLES , column TAUX_CHANGE.
    ORA-01722: invalid number

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Personne ?..

  6. #6
    Membre expérimenté
    Inscrit en
    Janvier 2009
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 162
    Par défaut
    Bonjour,

    Et là ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TAUX_CHANGE "TO_NUMBER(TRIM(:TAUX_CHANGE), '0d000000','NLS_NUMERIC_CHARACTERS=''.,''')"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ORA-01722: invalid number dans un SQLLOADER
    Par Cofondinde dans le forum SQL*Loader
    Réponses: 1
    Dernier message: 13/12/2007, 02h31
  2. Erreur 06550 invalid number or types of parameter
    Par freestyler1982 dans le forum JDBC
    Réponses: 3
    Dernier message: 17/11/2006, 13h49
  3. Erreur 01722 Invalide number
    Par freestyler1982 dans le forum Oracle
    Réponses: 8
    Dernier message: 09/11/2006, 15h28
  4. [SQL] Problème "Invalid number"
    Par EssaiEncore dans le forum Bases de données
    Réponses: 2
    Dernier message: 09/12/2005, 10h45
  5. [PowerBuilder 9] EditMask : problème Invalid Number
    Par loicmillion dans le forum Powerbuilder
    Réponses: 1
    Dernier message: 22/11/2004, 13h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo