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 12/06/2007, 09h58   #1
Invité de passage
 
Inscription : juin 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 13
Points : 2
Points : 2
Par défaut Limites SQL LOADER

Bonjour à tous.

Je viens de passer un peu de temps à éplucher les formus en quete de compléments d'informations sur SQL LOADER et je n'ai pas réellement trouvé les réponses à mes questions.

Pour faire bref :
Deux bases:
Une ancienne de laquelle on extrait les données au format CSV
Une nouvelle (Oracle 10g) dans laquelle on veut insérer les données de l'ancienne de manière périodique car lancienne base sert de référentiel et continue a être alimenté (du moins pendant un certain temps...)

Mon premier souci : je vais avoir dans un premier temps des insertions, puis par la suite des insertions ET mises à jour... Est -il possible via le fichier de controle d'SQLLOADER de vérifier si une ligne est deja en base, pour ne pas faire d'insert mais plutôt un update?

Mon deuxième souci : le MCD a évolué entre les deux bases et des notions de clés primaires clés étrangères ont été ajouté dans les tables... Aucun champs n'a disparu mais certains ont été ajoutés pour consolider les liaisons entre les tables..; Comment, est-il possible de gérer ces clés sachant qu'elles n'apparaissent pas dans mes fichiers d'entrée (issus de l'extraction de l'ancienne base, donc ancien MCD)...

Voila, je sais que ca fais bcp de questions, mais je commence à me demander si utiliser sql loader pour de telles manip ne va pas etre compliqué...

Merci pour vos futures réponses.
moumoutte32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 10h16   #2
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
1) tu ne peux pas faire d'Update avec sql*loader, la solution naturelle serait de charger les données dans une table en faisant un TRUNCATE (dans sqlloader), puis ensuite de fusioner les insertions et mises à jours avec un MERGE (dans sqlplus)

2) si tu as plus de colonne, ça ne pose aucun problème, tant qu'il y a des valeurs par défaut. quand aux clés, si tu acceptes des violations dans ton "chargement initial", il faut alors faire un DISABLE, le chargement, puis un ENABLE NOVALIDATE. S'il n'y a pas de violations, alors tout est bon
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 11h35   #3
Invité de passage
 
Inscription : juin 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 13
Points : 2
Points : 2
Par défaut complément d'information

Merci pour ta réponse.

Apres tes explications, les choses sont plus claires pour le merge, cependant les notions de DISABLE puis ENABLE NOVALIDATE restent flous...

Je récapitule ce que j'ai compris:
  1. Création d'une table temporaire qui est une copie de ma table destination(contraintes, champs...) je fais un disable lors de la création de cette table
  1. chargement de mon fichier CSV avec SQLLOADER (valeurs nulles par défaut pour les nouveaux champs) dans la table temp
  1. MERGE de la table temporaire et de la table de ma base
  1. Suppresion de ma table temporaire... (ou pas si j'utilise TRUNCATE lors de l'appel SQLLoader)

Voila, alors je ne saisi pas bien quand interviennent les notions de DISABLE puis ENABLE NOVALIDATE? Sur ma table temporaire? sur ma table destination lors du MERGE?

merci.
moumoutte32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 12h14   #4
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
1) création d'une table "intermédiaire" sans contraintes.
2) merge dans ta table "finale"

c'est tout. Quel est ton problème avec les contraintes?
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 12h25   #5
Invité de passage
 
Inscription : juin 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 13
Points : 2
Points : 2
en fait mon pb c'est que dans toutes mes tables je vais avoir des contraintes clé primaires clés étrangères.

A la première insertion, pas de souci, j'insère mes données, je crée une séquence pour incrémenter ma clé primaire... jusque là, niquel.
Mais comment je renseigne les clés étrangères avec la bonne valeur? Sachant que dans mon fichier que j'ai importé, je n'ai pas de "contraintes", si ce n'est des liaisons avec un ID (attribut commun à presque toutes le tables).
Du coup, je vais avoir des clé étrangères nulles qui ne correspondront du coup pas du tout avec la réalité de la base.
Mon problème est là... Comme puis-je mettre a jour mes clés étrangères d'une table?
Il va me falloir procéder de manière ordonnée, nan? les charger les unes apres les autres dans un ordre bien préscis?

J'ai été clair ?

merci !!!
moumoutte32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 13h35   #6
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
Citation:
Envoyé par moumoutte32
j'insère mes données, je crée une séquence pour incrémenter ma clé primaire
là t'es foutu

l'idée serait d'avoir une clé naturelle non-générée, style N° Employé ou Dept+DateDebut, etc...

Avec une séquence, c'est mission impossible. Comment vas-tu comparer <laurent;schneider> avec <1;laurent;schneider> si laurent schneider n'est pas unique...

Aucune chance! Il faudrait vraiment que tu choisisses une solution avec clé naturelle plutôt que clé "séquence".

Dans un scénario catastrophe, tu pourrais avoir une clé primaire générée et un algorythme maison pour faire correspondre les valeurs "naturelles" à une clé, mais bonjour l'intégrité !

Désolé pour ces mauvaises nouvelles
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 14h01   #7
Invité de passage
 
Inscription : juin 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 13
Points : 2
Points : 2
Mince alors je suis foutu...

En fait, dans la future base, il ya une clé générée pour chaque table qui servira pour des devs annexes, mais on garde aussi comme attribut de chaque table, un ID qui fait le lien entre toutes les tables, comme c'était fait avant.
Si tu veux la clé générée permet de lier les tables de manière un peu plus propres que ce qui avait était fait avant (ID_AGENT dans chaque table lié aux autres)...

Du coup, je pense que je peux m'en sortir en travaillant sur les ID_AGENT qui sont eux bels et bien uniques...

Mon problème réside alors sur la notion de clé étrangère car quand j'insère mes données, j'incrémente ma clé générée mais comment je vais savoir quelle valeur donner à ma clé étrangère qui fait référence à une autre clé primaire d'une autre table... Tu vois le hic?

Le moyen de contourner ceci est sans doute d'alimenter mes tables dans un ordre bien précis en commençant par celles qui n'ont pas de clés étrangères. Ainsi, par la suite, j'alimente mes clés étrangères de ma table mère en cherchant les clés primaires des autres tables où les valeurs des ID _AGENT sont identiques.

Voila, qu'en penses tu ? usine à gaz ?

Sinon, rassure moi, dans le cas d'une clée générée, si j'insère une donnée, la clé est incrémentée toute seuls non ? Si oui, du coup, pas besoin de séquence...

Merci bcp !
moumoutte32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 14h47   #8
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
c'est faisable, mais est-il vraiment nécessaire d'employer des séquences?

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
 
SQL> CREATE TABLE olddept(
  2    dept varchar2(10) PRIMARY KEY,
  3    description varchar2(20));
 
TABLE created.
 
SQL> CREATE TABLE oldemp(
  2    name varchar2(10) PRIMARY KEY,
  3    dept varchar2(10) REFERENCES olddept);
 
TABLE created.
 
SQL> 
SQL> CREATE TABLE newdept(
  2    dept varchar2(10),
  3    description varchar2(20),
  4    id number PRIMARY KEY);
 
TABLE created.
 
SQL> CREATE TABLE newemp(
  2    name varchar2(10),
  3    dept varchar2(10),
  4    id number PRIMARY KEY,
  5    deptid number REFERENCES newdept);
 
TABLE created.
 
SQL> 
SQL> CREATE sequence sdept;
 
Sequence created.
 
SQL> CREATE sequence semp;
 
Sequence created.
 
SQL> 
SQL> INSERT INTO olddept(dept,description)
  2    VALUES ('FINANCE','Finance Department');
 
1 row created.
 
SQL> INSERT INTO olddept(dept,description)
  2    VALUES ('ADMIN','Administration');
 
1 row created.
 
SQL> INSERT INTO oldemp(name,dept)
  2    VALUES ('JOHN','FINANCE');
 
1 row created.
 
SQL> INSERT INTO oldemp(name,dept)
  2    VALUES ('JACK','FINANCE');
 
1 row created.
 
SQL> INSERT INTO oldemp(name,dept)
  2    VALUES ('MARY','ADMIN');
 
1 row created.
 
SQL> 
SQL> merge INTO newdept
  2  USING olddept ON (newdept.dept=olddept.dept)
  3  when matched then
  4    UPDATE SET description=olddept.description
  5  when NOT matched then
  6    INSERT (dept,description,id)
  7      VALUES (olddept.dept,olddept.description,sdept.NEXTVAL);
 
2 rows merged.
 
SQL> 
SQL> merge INTO newemp
  2  USING oldemp ON (newemp.name=oldemp.name)
  3  when matched then
  4    UPDATE SET dept=oldemp.dept,
  5      id=semp.NEXTVAL,
  6          deptid=(SELECT newdept.id
  7              FROM newdept
  8                  WHERE newdept.dept=oldemp.dept)
  9  when NOT matched then
 10    INSERT (name,dept,id,deptid)
 11      VALUES (oldemp.name,oldemp.dept,
 12          semp.NEXTVAL,
 13      (SELECT newdept.id
 14              FROM newdept
 15                  WHERE newdept.dept=oldemp.dept));
 
3 rows merged.
 
SQL> 
SQL> SELECT * FROM oldemp JOIN olddept USING (dept);
 
DEPT       NAME       DESCRIPTION
---------- ---------- --------------------
FINANCE    JOHN       Finance Department
FINANCE    JACK       Finance Department
ADMIN      MARY       Administration
 
SQL> 
SQL> SELECT * FROM newemp JOIN newdept ON (newemp.deptid=newdept.id);
 
NAME       DEPT               ID     DEPTID DEPT       DESCRIPTION                  ID
---------- ---------- ---------- ---------- ---------- -------------------- ----------
JACK       FINANCE             1          1 FINANCE    Finance Department            1
MARY       ADMIN               2          2 ADMIN      Administration                2
JOHN       FINANCE             3          1 FINANCE    Finance Department            1
 
SQL>
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 14h49   #9
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
note clé générée = séquence...
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 15h10   #10
Invité de passage
 
Inscription : juin 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 13
Points : 2
Points : 2
ouais, je suis un peu obligé d'utiliser des clés générées.... Par contre, je pensais qu'il suffisait d'insérer une nouvelle donné pour que la clé soit incrémentée toute seul, apparemment, vu l'exemple que tu m'as donné, ce n'est pas le cas...?

Sinon, une autre question.. si lors de mon import du fichir avec SQLLoader, j'ai dans mon fichier CSV, une colonne qui n'existe plus dans ma base, est-il possible de l'ignorer à l'import ? Ou alors dois-je la suppromer à la mano avant de lancer mon script ?

merci pour tes réponses, elles m'aident pas mal....
moumoutte32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 16h16   #11
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
Dans ton fichier de controle tu spécifies tout ce que tu veux et tu n'as pas besoin d'importer ce que tu ne veux pas.

Il n'y a pas d'autoincrémentation, il n'y a que les séquences.
laurentschneider 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 14h40.


 
 
 
 
Partenaires

Hébergement Web