Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Outils > SQL*Loader
SQL*Loader Forum d'entraide sur Oracle SQL*Loader
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 26/01/2008, 10h06   #1
Invité de passage
 
Inscription : août 2007
Messages : 8
Détails du profil
Informations personnelles :
Âge : 41

Informations forums :
Inscription : août 2007
Messages : 8
Points : 0
Points : 0
Par défaut Question sur SQLLOADER

Bonjour tout le monde,

J'ai une question en espérant qu'elle n'a pas été postée auquel cas je suis en train de créer un doublon et je vous demanderais de m'excuser d'avance.

Droit au but :
Je charge un fichier dans une table Oracle via sqlldr

Ma question :
Que se passe t'il si le nombre de champ de l'une des lignes du fichier est supérieur au nombre de champs de la table de destination ?

Je n'ai pas de moyens techniques pour tenter l'expérience, pouvez-vous le faire pour moi ?

Avec un fichier contenant des valeurs séparée par un ";"
Chaque ligne doit se terminer par un ";"
Qu'importe le contenu des champs : number, char, date....

Merci pour votre aide.
blin_d1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2008, 14h08   #2
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Je crois que SQL*Loader fait partie de la distribution Oracle XE. L'installation d'Oracle XE créé une base prête à l'emploi pour SQL*Loader.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2008, 14h21   #3
Invité de passage
 
Inscription : août 2007
Messages : 8
Détails du profil
Informations personnelles :
Âge : 41

Informations forums :
Inscription : août 2007
Messages : 8
Points : 0
Points : 0
euuuuuh désolé je ne vois pas où tu veux en venir ?
blin_d1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2008, 14h22   #4
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Si vous avez un PC sous Windows ou Linux, vous pouvez installer Oracle XE et utiliser SQL*Loader.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2008, 14h29   #5
Invité de passage
 
Inscription : août 2007
Messages : 8
Détails du profil
Informations personnelles :
Âge : 41

Informations forums :
Inscription : août 2007
Messages : 8
Points : 0
Points : 0
Ok merci, mais en fait j'aurais souhaité dans une urgence relative le faire faire par quelqu'un qui aurait déja le matos...
En fait mon but étant de savoir s'il y aura un rejet des lignes dont le nombre de champs est supérieur au nombre de champ de la table.
la ligne contiendrait 3 champs et la table 2 champs !
Voilà si c'est possible que quelqu'un me fasse la manip ça serait super sympa.
Merci pour l'information concernant Oracle XE
blin_d1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2008, 16h34   #6
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
Je viens de tester et cela ne pose pas de probleme si le fichier control est bien configuré.

Exemple
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

Script  de création table (data.sql) :

create table test_loader
(
   code int,
   nom varchar2(30),
   creation date
);

Script de contrôle (data.ctl):

 load data
          infile 'data.csv'
          into table test_loader
          fields terminated by ";" optionally enclosed by '"'          
          ( code, nom, creation )

Fichier de données (data.csv):

"1";"nom 1";"12/12/1967";"extra field 1";
"2";"nom 2";"12/12/1956";"extra field 2";
"3";"nom 3";"12/12/1923";"extra field 3";

Exécution de SQL*Loader :

c:\>sqlldr control=data.ctl userid=xxx/yyy@zzz


Résultat :


SQL> select * from test_loader;

      CODE NOM                            CREATION
---------- ------------------------------ --------
         1 nom 1                          12/12/67
         2 nom 2                          12/12/56
         3 nom 3                          12/12/23
C'est tout bon !
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2008, 00h07   #7
Invité de passage
 
Inscription : août 2007
Messages : 8
Détails du profil
Informations personnelles :
Âge : 41

Informations forums :
Inscription : août 2007
Messages : 8
Points : 0
Points : 0
Merci Vicenzo (j'adore ce prénom!)

cela voudrait dire que le 4ème champ est tronqué !?

Pourquoi ne génère t'il pas de message d'erreur ? pas de contrôle du nombrede champs, ça me parait vraiment bizarre !!!

comment peut-on alors effectuer un contrôle du nombre de champs entre le ligne du fichier et la table ?

Merci.
blin_d1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2008, 00h57   #8
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
Si tu regardes le data.ctl, j'ai spécifie expressement les champs (3) à importer. Donc, les données surnuméraires ne sont pas gérées car superflues..

Je n'y vois rien de choquant ! si le fichier de contrôle spécifie X champs, la seule erreur doit être si le nombre de champs du fichier est < à X.

Pour preuve, voici le log de l'import (data.log) :

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
47
48
49
50
 
 
SQL*Loader: Release 10.2.0.1.0 - Production ON Sam. Janv. 26 16:29:40 2008
 
Copyright (c) 1982, 2005, Oracle.  ALL rights reserved.
 
Fichier de contrôle :   DATA.ctl
Fichier de données :      DATA.csv
  Fichier BAD :     DATA.bad
  Fichier DISCARD :  aucune spécification
 
 (Allouer tous les rebuts)
 
Nombre à charger : ALL
Nombre à sauter: 0
Erreurs permises: 50
Tableau de liens :     64 lignes, maximum de 256000 octets
Continuation :    aucune spécification
Chemin utilisé:      Classique
 
TABLE TEST_LOADER, chargé à partir de chaque enregistrement physique.
OPTION d'insertion en vigueur pour cette table : INSERT
 
   Nom de colonne               Position   Long.  Séparat. Encadrem. Type de données
------------------------------ ---------- ----- ---- ---- ---------------------
CODE                                FIRST     *   ;  O(") CHARACTER            
NOM                                  NEXT     *   ;  O(") CHARACTER            
CREATION                             NEXT     *   ;  O(") CHARACTER            
 
 
Table TEST_LOADER :
  Chargement réussi de 3 Lignes.
  0 Lignes chargement impossible dû à des erreurs de données.
  0 Lignes chargement impossible car échec de toutes les clauses WHEN.
  0 Lignes chargement impossible car tous les champs étaient non renseignés.
 
 
Espace affecté au tableau de liens :                  49536 octets(64 lignes)
Octets de tampon de lecture : 1048576
 
Nombre total d'enregistrements logiques ignorés :          0
Nombre total d'enregistrements logiques lus :             3
Nombre total d'enregistrements logiques rejetés :         0
Nombre total d'enregistrements logiques mis au rebut :        0
 
Le début de l'exécution a été effectué sur Sam. Janv. 26 16:29:40 2008
La fin de l'exécution a été effectuée sur Sam. Janv. 26 16:29:40 2008
 
Temps écoulé (ELAPSED) :     00:00:00.15
Temps processeur (CPU) :    00:00:00.11
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2008, 14h09   #9
Invité de passage
 
Inscription : août 2007
Messages : 8
Détails du profil
Informations personnelles :
Âge : 41

Informations forums :
Inscription : août 2007
Messages : 8
Points : 0
Points : 0
Bonjour,

Ok je vois plus clair maintenant !

je donne plus de détails sur pourquoi j'ai posé cette question.

J'effectue des tests de chargement de fichiers.
Les fichiers sont émis depuis un système pour être chargé dans un autre système via sqlldr dans des tables oracle.

Les développeurs du 2ème système me garantissent un rejet du fichier si la structure est érronée.
Ce qui est le ca quand le nombre de champs d'une des lignes du fichier est supérieur au nombre de champs de la table de destination.

Donc quand j'effectue le test, (sachant que je n'ai pas accés au système que via une interface), j'observe que les fichiers sont traitées et chargées normalement sauf les valeurs en plus.
Et lorsque j'ai demandé la raion, on m'a dit que le sqlldr a atteint ses limites et qu'il effectuait un truncate des champs en plus !

Ce qui n'est pas le cas, puisque (d'après ton explication), il charge le nombre de champs qu'on lui a demandé de charger et quand c'est fait, il passe à la ligne suivante.

Ma dernière question :
Comment peut on pousser le process à effectuer une comparaison de la structure des lignes avec celle de la table avant d'effectuer le charge
ent ? Est-ce possible avec le sqlldr ? sinon avec quoi ?

Merci par avance.
blin_d1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2008, 14h35   #10
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
Je suis pas un utilisateur régulier de sqlldr !

Tu peux rechercher dans la doc de sqlldr et sur les paramètres du fichier de contrôle...
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h28.


 
 
 
 
Partenaires

Hébergement Web