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

Oracle Discussion :

Formatage de type char en type number dans sql loader


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 98
    Par défaut Formatage de type char en type number dans sql loader
    Bonsoir, j'ai une préoccupation depuis 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 leur insertion dans ma BDD oracle à travers sql loader car mes champs dans BDD 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 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
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    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 y a un séparateur d'espace entre les milliers et c'est pour cela que j'utilise G pour l'indiquer.

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    QUANTITE  "TO_NUMBER(:QUANTITE,'999G999D99')"
    MONTANT_HT "TO_NUMBER(:MONTANT_HT,'999G999G999')",
    MONTANT_TTC "TO_NUMBER(:MONTANT_TTC,'999G999G999')"
    comme j'ai eu a le dire, j'ai essayé toute les possibilités je pense avec NLS_NUMERIC_CHARACTERS
     aussi voici la structure de ma table
    table ACHAT_PRODUIT(
    CODE_ETABL VARCHAR2(5),
    CODE_PRODUIT VARCHAR2(35),
    DESIGNATION VARCHAR2(128),
    QUANTITE NUMBER,
    MONTANT_HT NUMBER,
    MONTANT_TTC NUMBER,
    DATE_GENERATION DATE)
    j'espère que j'ai été plus précis et merci de vouloir m'aider

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 79
    Par défaut
    Salut,

    Oui, tu avais bien vu avec le NLS_NUMERIC_CHARACTERS, car ta session ne doit pas être configurée avec les bonnes valeurs. Pour vérifier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from v$nls_parameters ;
    Pour ton cas, on peut le préciser dans la fonction TO_NUMBER comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select TO_NUMBER('94 567,00', '99G999G999D00', 'NLS_NUMERIC_CHARACTERS ='', ''') n FROM dual;
     
             N
    ----------
         94567
    Attention,, le NLS_NUMERIC_CHARACTERS et sa valeur est un string, donc il faut échapper les quotes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NLS_NUMERIC_CHARACTERS =', ' => 'NLS_NUMERIC_CHARACTERS ='', '''

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 98
    Par défaut
    Merci de répondre j'ai essayer ses différentes méthodes et je précise que mon NLS_NUMERIC_CHARACTERS est une une virgule(,). mais rien n'y fait ça ne fonctionne pas

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 79
    Par défaut
    NLS_NUMERIC_CHARACTERS est en fait 2 caractères:
    - Le séparateur pour les décimales: ',' (ici virgule)
    - Le séparateur pour les groupes de mille: ' ' (ici espace)

    Dans le code que j'ai indiqué plus haut, l'espace suivant la virgule a donc son importance.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 98
    Par défaut
    Salut j'ai pris en compte cela le l'espace entre les milliers mais toujours la même erreur de nombre invalid

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 79
    Par défaut
    Ah, ok, désolé.
    Je n'ai jamais utilisé SQL*Loader, mais à tout hasard:

    Citation Envoyé par sabdoul Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    QUANTITE QUANTITE "TO_NUMBER(:QUANTITE,'999G999D99')"
    ...
    Ici, essaye de dire que c'est un char avant de la convertir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    QUANTITE char(50) TO_NUMBER(:QUANTITE,'999G999D99', 'NLS_NUMERIC_CHARACTERS ='', '''),
    ...
    (c'est peut-être une typo, dans ce cas je m'excuse à nouveau...)
    Edit: (et j'avais oublié une virgule à la fin de la ligne, sûrement une typo de ton message original)

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 98
    Par défaut
    Salut voici le 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
    LOAD DATA 
    APPEND
    INTO TABLE ACHAT_PRODUIT
    FIELDS TERMINATED BY ';'  
    TRAILING NULLCOLS
    (CODE_ETABL char(5) ,
    CODE_PRODUIT char(35) ,
    DESIGNATION char(128),
    QUANTITE  "TO_NUMBER(:QUANTITE, '999G999G999D99', 'NLS_NUMERIC_CHARACTERS ='', ''')",
    MONTANT_HT  "TO_NUMBER(:MONTANT_HT, '999G999G999D99', 'NLS_NUMERIC_CHARACTERS ='', ''')",
    MONTANT_TTC  "TO_NUMBER(:MONTANT_TTC, '999G999G999D99', 'NLS_NUMERIC_CHARACTERS ='', ''')",
    DATE_GENERATION Date "DD/MM/YYYY"
    )
    mais toujours la même erreur et ce qui est paradoxal ce que l'insertion se fait manuellement lorsque je suis sur sql plus avec la même syntaxe adaptée pour une insertion
    un exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into  achat_produit(MONTANT_HT) values(TO_NUMBER('52 120,00', '999G999G999D99', 'NLS_NUMERIC_CHARACTERS ='', '''));
    il n'y a pas de problème.

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 955
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 955
    Par défaut
    Avec ce fichier de control ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    LOAD DATA infile 'chemin_du_fichier\test.txt'
    APPEND
    INTO TABLE ACHAT_PRODUIT
    FIELDS TERMINATED BY ';'
    TRAILING NULLCOLS
    (CODE_ETABL,
    CODE_PRODUIT,
    DESIGNATION,
    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 ='', ''')",
    DATE_GENERATION Date "DD/MM/YYYY"
    )

  9. #9
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 79
    Par défaut
    Au moins, ca confirme que le problème est du côté du fichier de contrôle.
    Et même avec le type:

    ... QUANTITE char(50) "TO_NUMBER(:QUANTITE ...

    Là c'est ma dernière idée...

    Edit: ah... grillé... bon ben ne prends pas en compte ce message

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 98
    Par défaut
    Salut, j'ai eu a faire ce que apaul a proposer c'est à dire char(50) mais ça marche pas toujours.quant à la proposition de skuatamad c'est la même erreur. il ne fonctionne pas lui aussi. que faire ?

  11. #11
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 98
    Par défaut
    je pense que le problème se trouve au niveau du séparateur de milliers qui est un espace car les lignes ne comportant pas des milliers sont insérés contrairement au ligne avec des milliers qui eux ont des espaces séparateurs.
    j'ai besoin de votre aide

  12. #12
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Un peu système D mais ça devrait fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    QUANTITE char(50) TO_NUMBER(REPLACE(:QUANTITE,' ',''),'999999D99'),
    ...

  13. #13
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 79
    Par défaut
    Ah... Peut-être que l'espace de ton fichier source n'est pas un vrai (mais un "espace insécable" ou autre...)

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

Discussions similaires

  1. Gestion des exceptions dans sql*loader
    Par sabdoul dans le forum SQL*Loader
    Réponses: 0
    Dernier message: 06/03/2013, 14h00
  2. Condition dans SQL LOADER
    Par xeron33 dans le forum SQL*Loader
    Réponses: 3
    Dernier message: 18/01/2013, 22h29
  3. [Performance] Type int vs type char
    Par AnozerOne dans le forum C
    Réponses: 3
    Dernier message: 15/05/2011, 20h44
  4. [10g]ORA-01008 dans SQL*Loader
    Par isa06 dans le forum SQL
    Réponses: 3
    Dernier message: 11/05/2006, 18h17
  5. Erreur dans SQL*Loader
    Par AkA dans le forum SQL
    Réponses: 6
    Dernier message: 30/03/2006, 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