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 17/03/2008, 11h58   #1
Invité de passage
 
Inscription : octobre 2006
Messages : 3
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2006
Messages : 3
Points : 1
Points : 1
Par défaut [SQL*LOADER] Import dans plusieurs tables avec contraintes

Bonjour,
Je m'excuse d'avance si ce sujet a déjà été traité, mais je n'ai pas trouvé de réponse exacte à mon problème.
Je souhaite charger un fichier à plat au format CSV dans une base Oracle 9i.
J'ai du mal a écrire mon fichier de contrôle pour mener à bien cette opération car j'ai une contrainte qui est la suivante :
Mon fichier à plat contient 28 colonnes, dont l'ordre ne peut pas être changé.
Les 20 premières colonnes doivent aller dans une table, pour cela pas de problème.
Par contre, les 2 premières colonnes et les 8 dernières doivent aller dans une 2ème table.
Je voudrais faire cette opération avec un seul fichier d'import (CSV) et un seul fichier de contrôle (CTL) pour SQL*LOADER.
J'ai essayé avec 2 clauses "into" dans le fichier de contrôle mais sans succès car je ne sais pas comment "aiguiller/dupliquer" correctement les 2 premières colonnes + les 8 dernières dans la 2ème table... car il n'existe pas de "mapping" avec SQL*LOADER (enfin à ma connaissance).
J'ai réussi en trichant : Dupliquer les 2 premières colonnes en question avant les 8 dernières dans le fichier, mais ce n'est pas bon parce que dans les faits je ne pourrai pas changer la structure du fichier d'import, j'ai fait cela juste pour tester...
Autre contrainte de taille, je ne peux pas utiliser l'option POSITION, car mes champs peuvent être amenés à changer dans le temps donc pas question d'utiliser le format fixe, j'ai un séparateur point-virgule dans mon fichier à plat et je dois m'en contenter.
Toute aide sur la question est la bienvenue.
Je vous en remercie d 'avance.
galactorus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2008, 12h43   #2
Nouveau Membre du Club
 
Inscription : novembre 2006
Messages : 113
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 113
Points : 32
Points : 32
Bonjour,

tu trouveras la réponce à ton problème sur le lien suivant:

http://jaouad.developpez.com/sqlldr/

V-D. Comment charger les mêmes données dans plusieurs tables
Ici on va séparer les enregistrements des fichiers dans deux tables différentes :
Les nom dans la table dvp_loader et les salaires dans la table dvp2_loader.
Changer le fichier de contrôle :


LOAD DATA INFILE 'data.csv'
INTO TABLE DVP_LOADER
FIELDS TERMINATED BY ';'
(
NOM
)
INTO TABLE DVP2_LOADER
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
(

b
)
Lancer la commande.
Le résultat :


SQL> select * from dvp_loader ;

NOM SALAIRE
-------------------- ----------
Jaouad
orafrance
léoanderson
bouyao
Nuke_y
sheikyerbouti
pomalaix
titides
aline
denisys
niourk

11 ligne(s) sélectionnée(s).

SQL> select * from dvp2_loader ;

A B
-------------------- ----------
100
200
300
400
500
600
700
800
900
1000
1100

11 ligne(s) sélectionnée(s).


J'espere que c'est ce que tu cherche
Bonne journée
fatati est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2008, 14h01   #3
Invité de passage
 
Inscription : octobre 2006
Messages : 3
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2006
Messages : 3
Points : 1
Points : 1
Merci pour votre réponse rapide.

J'avais déjà consulté le tutoriel de Jaouad, qui est très bien expliqué d'ailleurs.

Mais le fait est que l'exemple proposé ne dit pas comment faire en sorte qu'une seule et même colonne du fichier à plat soit injectée dans 2 tables différentes, sans que cette donnée ne soit dupliquée dans le fichier d'import.

Sur l'exemple proposé, il n'est pas expliqué comment il serait possible de mettre les NOMS dans la première ET la deuxième table, et les SALAIRES seulement sur la deuxième, et c'est plutôt cela que je cherche à faire dans mon cas.
galactorus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2008, 15h42   #4
Invité de passage
 
Inscription : octobre 2006
Messages : 3
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2006
Messages : 3
Points : 1
Points : 1
Le problème est réglé, Jaouad m'a dit qu'il est impossible d'effectuer ce que je veux faire...
Dommage mais au moins je suis fixé!
@+
galactorus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2008, 16h41   #5
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 319
Points : 5 837
Points : 5 837
Utilisez une table externe à la place du chargement par SQL Loader et fait les insertions dans l'ordre imposé par les constraints.
mnitu 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 09h00.


 
 
 
 
Partenaires

Hébergement Web