|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : juin 2007 Messages : 13 ![]() |
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. |
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 927 ![]() |
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 |
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : juin 2007 Messages : 13 ![]() |
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:
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. |
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 927 ![]() |
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? |
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : juin 2007 Messages : 13 ![]() |
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 !!! |
|
|
00
|
|
|
#6 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 927 ![]() |
Citation:
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
|
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : juin 2007 Messages : 13 ![]() |
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 ! |
|
|
00
|
|
|
#8 | ||
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 927 ![]() |
c'est faisable, mais est-il vraiment nécessaire d'employer des séquences?
Code :
|
||
|
00
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 927 ![]() |
note clé générée = séquence...
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Inscription : juin 2007 Messages : 13 ![]() |
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....
|
|
|
00
|
|
|
#11 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 927 ![]() |
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. |
|
00
|
Copyright © 2000-2012 - www.developpez.com