Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/12/2007, 09h59   #1
Invité de passage
 
Inscription : décembre 2007
Messages : 10
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : décembre 2007
Messages : 10
Points : 4
Points : 4
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 :

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

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

Citation:
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.
Switch03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 10h14   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
tu peux pas faire un SKIP quand la 1° colonne est différente de 50 ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 10h24   #3
Invité de passage
 
Inscription : décembre 2007
Messages : 10
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : décembre 2007
Messages : 10
Points : 4
Points : 4
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.
Switch03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 10h35   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
ce serait pas mal d'avoir le control file
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 10h45   #5
Invité de passage
 
Inscription : décembre 2007
Messages : 10
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : décembre 2007
Messages : 10
Points : 4
Points : 4
Le voici :

Code :
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')
)
Switch03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 15h59   #6
Invité de passage
 
Inscription : décembre 2007
Messages : 10
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : décembre 2007
Messages : 10
Points : 4
Points : 4
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 ?
Switch03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 16h12   #7
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Ne serait-ce pas plus simple de faire un petit traitement avant d'envoyer le fichier à l'emplacement prévu ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 18h00   #8
Invité de passage
 
Inscription : décembre 2007
Messages : 10
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : décembre 2007
Messages : 10
Points : 4
Points : 4
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.
Switch03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 09h54   #9
Invité de passage
 
Inscription : décembre 2007
Messages : 10
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : décembre 2007
Messages : 10
Points : 4
Points : 4
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.
Switch03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h50.


 
 
 
 
Partenaires

Hébergement Web