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 :

[SQL*Loader] Problème de chargement de nombres


Sujet :

Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Par défaut [SQL*Loader] Problème de chargement de nombres
    Bonjour,

    Je cherche à charger un fichier plat dans une table via SQL*Loader, et certains champs qui sont des nombres me posent problème.

    Quelques contraintes à ce sujet :

    - Le format des nombres dans le fichier plat ne sont pas modifiables.
    - Je dois utiliser SQL*Loader et aucune table temporaire.
    - Le format d'arrivée des nombres est NUMBER(20,6).


    Voici donc les fameux types de nombres incriminés :

    Type A : 31.93866096530216 trop de décimales pour mon champ d'arrivée.

    Type B : 4.469880223679272e-08 nombre farfelu avec exposant (qui arrive à la place des 0, mais je ne peux rien y faire en amont comme je l'ai dit plus haut ).


    Maintenant voici ce que j'ai testé :

    1- Ne rien faire : aucun des 2 types ne passe.

    2- Mettre la clause TO_NUMBER(RR_MT_01 ,'9999999999999999999.99999999999999999999') : le type A passe (et est tronqué à 6 décimales à cause de la structure de la table, c'est bien ce que je souhaite), mais le type B est rejeté.


    Je ne sais plus quoi faire. Il me semblait avoir eu un cas similaire d'exposants il y a quelques mois, mais ça c'était bien passé et il m'avait chargé soit 0 soit NULL.
    Notez bien que j'autorise que le champ soit à NULL

    Entre temps, j'ai dû réinstaller le kit de développement ORACLE (qui contient SQL*Loader) et je n'ai aucune idée des différences qu'il peut y avoir entre l'ancien et le nouveau.
    Pensez-vous qu'il existe une option à configurer sur SQL*Loader pour ne pas rejeter ces exposants et les traiter comme des 0 ou des NULL ??

    Et sinon, des idées pour que mes 2 types de champs soient chargés ?


    J'espère avoir été clair

    Merci d'avance pour votre aide

  2. #2
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Par défaut
    Bonjour,

    est-ce un traitement ponctuel ?

    si oui, pourquoi ne pas envisager de rediriger dans un fichier bad les lignes rejetées et de les traiter manuellement.

    Il te suffirai alors de modifier ton fichier CTL comme suit :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    LOAD DATA
         INFILE "PATH_FICHIER\Monfichier.txt"
         BADFILE "PATH_FICHIER\bad.bad" 
    ...
    c'est juste une idée !

    @

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

    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Par défaut
    Citation Envoyé par PpPool
    Bonjour,

    est-ce un traitement ponctuel ?

    si oui, pourquoi ne pas envisager de rediriger dans un fichier bad les lignes rejetées et de les traiter manuellement.

    Il te suffirai alors de modifier ton fichier CTL comme suit :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    LOAD DATA
         INFILE "PATH_FICHIER\Monfichier.txt"
         BADFILE "PATH_FICHIER\bad.bad" 
    ...
    c'est juste une idée !

    @


    Mouarf c'est tout à fait possible techniquement parlant. Il s'agit de plus d'un traitement ponctuel effectivement.
    Cependant sur un fichier plat de 120Mo, les rejets risquent d'être volumineux :o
    Et je ne suis pas sûr que ce soit une solution acceptable pour mes boss, d'autant plus que j'aurai sans doute à traiter des fichiers du même type, mais dans des processus mensuels et automatisés. Donc le manuel...

    Je vais voir ce que ça donne en quantité de rejets, histoire d'avoir une solution "de secours" en attendant mieux, mais je ne pense pas que ça puisse être accepté comme solution finale.

    Merci quand même

    D'autres idées ?

  4. #4
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Par défaut
    Bonjour

    tu peux toujours attaquer ton fichier bad avec une procédure PL/SQL en t'appuyant pour cela sur le package UTL_FILE

    enfin je suis d'accord avec toi cela reste une solution adaptée uniquement à des traitements ponctuels.

    sinon il te reste à attaquer ton fichier avant l'appel de SQL*Loader avec par exemple un script PERL pour le 'formater' au mieux.

    cela ne reste que des idées.
    @

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

    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Par défaut
    Citation Envoyé par PpPool
    Bonjour

    tu peux toujours attaquer ton fichier bad avec une procédure PL/SQL en t'appuyant pour cela sur le package UTL_FILE

    enfin je suis d'accord avec toi cela reste une solution adaptée uniquement à des traitements ponctuels.

    sinon il te reste à attaquer ton fichier avant l'appel de SQL*Loader avec par exemple un script PERL pour le 'formater' au mieux.

    cela ne reste que des idées.
    @

    Je comprends bien tout ça

    Simplement, comme c'est une procédure qu'il va falloir automatiser, ça ne va pas être possible.

    Je crois que la solution est plutôt dans la config d'Oracle. Je suis quasi sûr d'avoir réussi à faire passer ces putains de nombres avec exposants comme étant des 0 avec mon ancienne config.
    Et depuis que j'ai dû réinstaller le client Oracle et le kit de développement (qui contient SQL*Loader), je ne peux plus.

    Y a-t-il un expert en config Oracle dans la salle ? Pcq moi j'y connais que dalle

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Par défaut
    Question subsidiaire, mais qui pourrait régler en partie mon problème : où puis-je configurer le NLS_LANGUAGE sur mon PC (en client Oracle quoi) ?

    Je suis en FRENCH, le serveur est en AMERICAN, je crains des soucis à cause de cela.

    J'ai créé la variable d'environnement et rebooté, mais rien à faire, je suis toujours en FRENCH.

    Dans quel fichier de ora817 puis-je modifier cela ? J'ai maté dans oraparam.ini, mais c'est pas là, il y a juste 'NLS_ENABLED=TRUE'

  7. #7
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Tu peux le paramétrer dans ta base de registre clé oracle.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Par défaut
    Citation Envoyé par plaineR
    Tu peux le paramétrer dans ta base de registre clé oracle.

    C'est ce que j'ai fait, en mettant NLS_LANG à AMERICAN_AMERICA.WE8ISO8859P1 au lieu de FRENCH_FRANCE.WE8ISO8859P1

  9. #9
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Il faut mettre AMERICAN_AMERICA
    Si ça ne marche toujours pas mets : AMERICAN_AMERICA.WE8ISO8859P1

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Par défaut
    Je deviens fou

    J'essaie un simple insert de ces nombres dans les tables (sans formatage aucun), et :

    - ceux qui ont trop de décimales sont tronqués
    - ceux qui ont un exposant sont insérés à la valeur 0


    Bref, tout ce que je veux !! Et pourtant, via mon CTL, même en ne reformatant rien, ça ne passe pas et il me dit "Invalid number" !!

    Je suis donc convaincu que ça vient d'une config d'Oracle ou SQL*Loader...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Par défaut
    Bon, n'ayant pas trouvé comment configurer Oracle pour que ça passe sans soucis, j'ai gratté une solution à base d'appels de fonctions.

    Et un truc vraiment tout con marche : TO_CHAR(NR_MT_01)

    En effet je fais passer mes indicateurs comme des chaînes de caractères, l'exposant ne casse plus le chargement.

    Ensuite, à l'insertion, comme la table attend des NUMBER(20,6), ben elle reformate tout toute seule comme une grande. Mes nombres avec trop de décimales sont arrondies à 6 décimales, et mes nombres à exposant négatifs deviennent des 0.

    Je trouve cependant curieux que SQL*Loader ne considère pas par défaut qu'il s'agit de chaînes de caractères, vu que ma source est un fichier texte...

    Je tenais à transmettre pour ceux qui auraient le même soucis

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

Discussions similaires

  1. SQl LOADER: Problème de date
    Par claralavraie dans le forum SQL*Loader
    Réponses: 25
    Dernier message: 28/03/2017, 11h24
  2. Réponses: 7
    Dernier message: 31/03/2008, 14h31
  3. Réponses: 19
    Dernier message: 18/12/2007, 16h07
  4. [SQL*LOADER] Problème contrainte
    Par Spyco dans le forum Oracle
    Réponses: 2
    Dernier message: 12/01/2006, 08h52
  5. Réponses: 4
    Dernier message: 10/06/2004, 18h05

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