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 :

SQL Loader + CSV (sans noms de colonne) + clause WHEN


Sujet :

SQL*Loader Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut SQL Loader + CSV (sans noms de colonne) + clause WHEN
    Bonjour à tous.

    Après avoir parcouru de nombreux posts ici, je n'ai pu trouver la solution à mon problème que voici :

    Je dois charger un fichier CSV, sans nom de colonne, avec séparateur de colonne (,) et données entre " ".

    Jusque là rien de particulier, sauf que dans ce fichier se trouvent plusieurs "types" de lignes, reconnaissables grâce à la valeur de la 2e colonne. Et c'est là que ça se complique.

    Si la valeur de la 2e colonne = A, la ligne doit aller dans une table, si la valeur = B, dans une autre table, etc...

    J'ai essayé plusieurs façon, rien n'y fait.

    Voici ce que j'ai testé dans le CTL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     LOAD DATA
    APPEND
    INTO TABLE XX
    WHEN (2) = '"A"'
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"'
    TRAILING NULLCOLS
    => toutes les lignes finissent dans le 'discard file'

    => toutes les lignes finissent dans le 'discard file'

    => les lignes 'A' finissent dans le 'bad file', les autres dans le 'discard file'

    voici la tête de mon fichier lu avec PSPad
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    "3749 932632 21008","A",127857,38,8402594,"9326322 09243",14,"EUR","BT49"
    "3749 932632 21008","F","3","240333316 455000","","2","","9492941653"
    "3749 932632 21008","F","3","240333316 456000","","2","","9492941653"
    "3749 932632 21008","F","3","240333316 457000","","2","","9492941653"
    "3749 932632 21008","B","G","","000000000243849","D","000000000000800"
    "3749 932632 21008","Z","9326322 09243"
    Please help...

  2. #2
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    nouveau test réalisé :

    J'ai modifié mon fichier plat en ne laissant qu'une ligne, et j'ai donc supprimé la clause when dans le CTL.

    Le traitement fini en erreur malgré tout...

    Voici les messages du journal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SQL*Loader: Release 8.0.6.3.0 - Production on Me Sep 9 11:17:37 2009
     
    (c) Copyright 1999 Oracle Corporation.  All rights reserved.
     
    Point de validation (COMMIT) atteint - nombre d'enregis. logiques 1
     
    Error: Loading data file...
    Failed, SQL*Loader. Please check output file...
     
    Printing Bad file...
    "3749 932632 21008","A",127857,38,8402594,"9326322 09243",14,"EUR"
    Truncating the staging table 
    Error: Failed to load data !
    Programme sortie avec statut 1

  3. #3
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    Bonjour,

    Pourrais-tu donner la structure de ta table et le .ctl complet pour pouvoir regarder en détail et essayer de reproduire ?

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Alors, depuis j'ai pisté, j'ai testé qu'avec une ligne type 'A' et en fait il s'avère que le problème venait de la taille d'une colonne de ma table d'accueil

    Bon, du coup maintenant je me retrouve avec un problème que je soupconnais, à savoir :

    lorsque je lance le traitement avec un ctl unique (j'entend par là, un seul ' INTO XX WHEN...') ça fonctionne, alors que lorsque je lance le traitement avec un ctl multiple (plusieurs ' INTO XX WHEN...' donc) il ne prend en compte que le 1er INSERT...
    Du coup il ne traite pas la totalité des lignes de mon fichier...

    voici un extrait du ctl 'multiple' :
    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
    24
    25
    26
    27
    28
    29
    30
     
    LOAD DATA
    APPEND
    INTO TABLE XX_HEAD
    WHEN (22:22) = 'A'
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"'
    TRAILING NULLCOLS
     (
       n_bta                  NULLIF (n_bta=BLANKS)                "TRIM(:n_bta)"
      ,type_ligne             NULLIF (type_ligne=BLANKS)   "TRIM(:type_ligne)"
      ,id_amex                NULLIF (id_amex=BLANKS)   "TRIM(:id_amex)"
      ,INFO_AMEX1             NULLIF (INFO_AMEX1=BLANKS)                "TRIM(:INFO_AMEX1)" 
      ,INFO_AMEX2             NULLIF (INFO_AMEX2=BLANKS)           "TRIM(:INFO_AMEX2)"
      ,REF_RELEVE             NULLIF (REF_RELEVE=BLANKS)           "TRIM(:REF_RELEVE)"
      ,INFO_AMEX3             NULLIF (INFO_AMEX3=BLANKS)      "TRIM(:INFO_AMEX3)" 
    (...)
    INTO TABLE XX_LINE
    WHEN (22:22) = 'F'
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"'
    TRAILING NULLCOLS
     (
       n_bta                  NULLIF (n_bta=BLANKS)                "TRIM(:n_bta)"
      ,type_ligne             NULLIF (type_ligne=BLANKS)   "TRIM(:type_ligne)"
      ,TYPE_P                 NULLIF (TYPE_P=BLANKS)   "TRIM(:TYPE_P)"
      ,REF_RELEVE             NULLIF (REF_RELEVE=BLANKS)                "TRIM(:REF_RELEVE)" 
      ,VIDE1                  NULLIF (VIDE1=BLANKS)           "TRIM(:VIDE1)"
      ,TYPE_TRANS             NULLIF (TYPE_TRANS=BLANKS)           "TRIM(:TYPE_TRANS)"
      ,NOM_AG                 NULLIF (NOM_AG=BLANKS)      "TRIM(:NOM_AG)"

    P.S. :
    le WHEN (2) = 'F' (en théorie la 2e colonne) ça marche pas, alors que le WHEN (22:22) = 'F' (en positionnel donc) ça marche... heureusement que dans mon fichier, les 2 premières colonnes sont des longueurs fixes

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Alors, j'ai finalement trouvé la solution
    Il faut impérativement ajouter l'instruction 'POSITION(1)' après le 1er champ du 2e INTO, pour lui indiquer à partir d'où il doit lire le fichier.
    En gros, ça lui dit "reviens au début de la ligne" !!!!
    bah oui il est bête, l'animal !!!

    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
    APPEND
    INTO TABLE XX_HEAD
    WHEN (22:22) = 'A'
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"'
    TRAILING NULLCOLS
     (
       n_bta                  NULLIF (n_bta=BLANKS)                "TRIM(:n_bta)"
      ,type_ligne             NULLIF (type_ligne=BLANKS)   "TRIM(:type_ligne)"
      ,id_amex                NULLIF (id_amex=BLANKS)   "TRIM(:id_amex)"
    (...)
    INTO TABLE XX_LINE
    WHEN (22:22) = 'F'
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"'
    TRAILING NULLCOLS
     (
       n_bta                 POSITION(1) NULLIF (n_bta=BLANKS)                "TRIM(:n_bta)"
      ,type_ligne             NULLIF (type_ligne=BLANKS)   "TRIM(:type_ligne)"
      ,TYPE_P                 NULLIF (TYPE_P=BLANKS)   "TRIM(:TYPE_P)"
      ,REF_RELEVE             NULLIF (REF_RELEVE=BLANKS)
    Voilà, en espérant que ça servira...

    lien vers la source : http://download.oracle.com/docs/cd/B...e.htm#i1005614

  6. #6
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    Citation Envoyé par surfman Voir le message
    Voilà, en espérant que ça servira...
    Merci pour l'info, je ne connaissais pas cette "subtilité"!

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/03/2012, 10h20
  2. Réponses: 5
    Dernier message: 21/09/2009, 03h03
  3. Réponses: 4
    Dernier message: 25/01/2008, 17h24
  4. SQL Loader : deux champs dans une colonne
    Par Kiroukool dans le forum SQL*Loader
    Réponses: 4
    Dernier message: 05/10/2007, 10h21
  5. SQL LOADER: Récupérer le nom d'un fichier
    Par claralavraie dans le forum SQL*Loader
    Réponses: 4
    Dernier message: 09/01/2006, 09h09

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