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 Oracle Discussion :

SQL*Loader : contourner l'insertion de certaines lignes


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut SQL*Loader : contourner l'insertion de certaines lignes
    Bonjour,

    Voici mon problème :

    Je dispose d'un fichier permettant d'insérer dans une table externe via le SQL*Loader de la forme suivante :

    01|valeur1|valeur2|valeur3|
    50|data1|data2|data3|data4|data5|data6|data7
    50|data1|data2|data3|data4|data5|data6|data7
    ...
    50|data1|data2|data3|data4|data5|data6|data7
    50|data1|data2|data3|data4|data5|data6|data7
    50|data1|data2|data3|data4|data5|data6|data7
    99|valeur|
    Ce fichier dispose donc d'un en-tête et d'un en-pied qui ne dispose pas du même nombre de colonnes que les données et les données contenues dans ces première et dernière ligne ont une taille supérieure à celle devant être insérées dans la table externe.

    Dans le SQL*Loader, j'utilise un LOAD WHEN sur la première colonne mais le traitement me ressort les erreurs suivantes :

    KUP-04021: field formatting error for field DATA3
    KUP-04026: field too long for datatype
    KUP-04101: record 1 rejected in file /BOFI/data/in/TCEENB/F04B19072007.001
    KUP-04021: field formatting error for field DATA3
    KUP-04023: field start is after end of record
    KUP-04101: record 202 rejected in file /BOFI/data/in/TCEENB/F04B19072007.001
    Je ne peut pas utiliser de SKIP car il se peut que mon en-tête soit sur plusieurs lignes et la quantité de données à insérer dans la table est variable.

    Voici comment peut se présenter le fichier :

    01|valeur1|valeur2|valeur3|
    02|valeur4|valeur5|
    50|data1|data2|data3|data4|data5|data6|data7
    50|data1|data2|data3|data4|data5|data6|data7
    ...
    50|data1|data2|data3|data4|data5|data6|data7
    50|data1|data2|data3|data4|data5|data6|data7
    50|data1|data2|data3|data4|data5|data6|data7
    99|valeur|
    Je n'ai aucun pouvoir sur la création du fichier de données qui me sont fournis.

    Ma question est donc la suivante :

    Comment faire pour que le SQL*Loader ne prenne en compte que les lignes du fichier dont la première colonne vaut 50.

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    tu peux pas faire un SKIP quand la 1° colonne est différente de 50 ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par orafrance Voir le message
    tu peux pas faire un SKIP quand la 1° colonne est différente de 50 ?
    Je ne comprend pas ce que tu veux dire.

    D'après ce que j'ai compris, le SKIP s'applique sur une ligne en particulier en lui donnant le numéro de la ligne mais dans mon cas, je ne sais pas conbien de ligne j'ai à supprimer (l'en-tête faisant 1, 2, 3,... lignes et la position de l'en-pied vairant forcément avec le nombre d'enregistrement dans le fichier).

    Un bout de code pour m'expliquer serait le bienvenu.

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    ce serait pas mal d'avoir le control file

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Le voici :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    CREATE TABLE SQLLDR_TABLE
    (
       TYPE_ENREGISTREMENT VARCHAR2(2),
       CHAMP1 VARCHAR(5),
       CHAMP2 VARCHAR(5),
       CHAMP3 VARCHAR(5),
       CHAMP4 VARCHAR(5),
       CHAMP5 VARCHAR(5),
       CHAMP6 VARCHAR(5),
       CHAMP7 VARCHAR(5)
    )
    ORGANIZATION EXTERNAL
    (
       TYPE oracle_loader DEFAULT DIRECTORY SQLLDR_TABLE_TMPDIR_00000
       ACCESS PARAMETERS
       (
          RECORDS DELIMITED BY NEWLINE 
             LOAD WHEN
             (
                  (TYPE_ENREGISTREMENT = '50')
              AND (CHAMP1 != BLANKS)
              AND (CHAMP2 != BLANKS)
              AND (CHAMP3 != BLANKS)
              AND (CHAMP4 != BLANKS)
              AND (CHAMP5 != BLANKS)
              AND (CHAMP6 != BLANKS)
              AND (CHAMP7 != BLANKS)
             )
             BADFILE SQLLDR_TABLE_TMPDIR_00001:'&1..bad'
             LOGFILE SQLLDR_TABLE_TMPDIR_00002:'&1..log'
             DISCARDFILE SQLLDR_TABLE_TMPDIR_00001:'&1..dsc'
             FIELDS TERMINATED BY "|"
             (
              TYPE_ENREGISTREMENT CHAR(2),
              CHAMP1 CHAR(5),
              CHAMP2 CHAR(5),
              CHAMP3 CHAR(5),
              CHAMP4 CHAR(5),
              CHAMP5 CHAR(5),
              CHAMP6 CHAR(5),
              CHAMP7 CHAR(5)
             )
       )
          LOCATION (SQLLDR_TABLE_TMPDIR_00000:'&1')
    )

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Je viens de rendre compte que les données étaient chargées puis contrôlées avec le LOAD WHEN.

    Existe-t-il un moyen de vérifier les lignes avant de les charger ?

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Ne serait-ce pas plus simple de faire un petit traitement avant d'envoyer le fichier à l'emplacement prévu ?

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Ne serait-ce pas plus simple de faire un petit traitement avant d'envoyer le fichier à l'emplacement prévu ?
    J'ai essayé cette méthode en générant un fichier de données temporaires ne contenant que les enregistrements dont la ligne commence par 50 via un script KSH et le tout à l'air de fonctionner.

    Le seul problème provient du temps de traitement qui est négligeable lorsque la quantité de données traitées est faible (environ 15 minutes pour 20000 enregistrements en générant le fichier temporaire contre 10 minutes avant)
    mais les fichiers de données complets contiennent plusieurs gigas de données et le traitement actuel complet dure déjà 13 heures environ et la perte de temps n'est pas négligeable.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    J'ai réussi à avoir un expert Oracle au téléphone ce matin et qui m'a confirmer que mon cas n'était pas possible à réaliser.

    Il faut donc que je me rabatte vers la solution de supprimer les lignes d'en-tête et d'en-pied.

    reste à voir si le client acceptera les temps de traitement allongés.

    Mais si quelqu'un a une solution autre, je suis ouvert à toute proposition.

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

Discussions similaires

  1. SQL Loader en mode Insert/Update ?
    Par Hobbi1 dans le forum SQL*Loader
    Réponses: 0
    Dernier message: 05/07/2008, 11h39
  2. [ORACLE 8.1.7] SQL LOADER, Perte de ligne !
    Par ApprentiOracle dans le forum SQL*Loader
    Réponses: 6
    Dernier message: 10/08/2006, 17h09
  3. Réponses: 6
    Dernier message: 10/08/2006, 15h45
  4. Réponses: 1
    Dernier message: 26/04/2006, 09h52
  5. 8i : sql loader et champ texte sur plusieurs lignes
    Par naonedboy dans le forum SQL*Loader
    Réponses: 1
    Dernier message: 23/11/2005, 10h07

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