IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL*Loader Oracle Discussion :

Limites SQL LOADER


Sujet :

SQL*Loader Oracle

  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 13
    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.

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    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

  3. #3
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 13
    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.

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    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?

  5. #5
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 13
    Par défaut
    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 !!!

  6. #6
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    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

  7. #7
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 13
    Par défaut
    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 !

  8. #8
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    c'est faisable, mais est-il vraiment nécessaire d'employer des séquences?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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>

  9. #9
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    note clé générée = séquence...

  10. #10
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 13
    Par défaut
    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....

  11. #11
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    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.

Discussions similaires

  1. équivalent SQL*Loader pour FB / IB
    Par djeant dans le forum Outils
    Réponses: 9
    Dernier message: 10/01/2005, 21h26
  2. Chargement de fichier par SQL LOADER
    Par davy.g dans le forum SQL*Loader
    Réponses: 17
    Dernier message: 15/11/2004, 13h08
  3. SQL LOADER
    Par velo83 dans le forum SQL*Loader
    Réponses: 2
    Dernier message: 25/10/2004, 08h24
  4. Réponses: 4
    Dernier message: 10/06/2004, 18h05
  5. erreur sql loader et performance
    Par mobisky dans le forum SQL*Loader
    Réponses: 14
    Dernier message: 20/08/2003, 12h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo