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 :

Condition dans SQL LOADER


Sujet :

SQL*Loader Oracle

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 755
    Points : 208
    Points
    208
    Par défaut Condition dans SQL LOADER
    bonjour à tous,
    Peut on et si oui comment fait on pour créer une condition de chargement avec SQL LOADER ?
    JE m'explique :
    J'ai une toute petite base avec 2 tables : Paie et Type_Ligne :
    Paie (.....,......,PAI_Code_Ligne); ou PAI_Code_Ligne est la clé étrangère de Paie liant les 2 tables
    Type_Ligne(TYL_Code_Ligne,TYL_LIB_LIGNE); ou TYL_Code_Ligne est la clé primaire de Type_Ligne
    j'ai un fichier texte de cet ordre :
    89877|TEN|

    Le premier ne pose pas de problème il correspond à un champ de la 1ère table de la base, par contre le second correspond au libéllé de la table Type_Ligne et je voudrais pouvoir suivant la valeur de ce libéllé alimenter ma table PAIE et notament ma clé étrangère sans charger cette valeur dans la base car cette valeur est déjà connue par la table Type_Ligne :
    si cette valeur vaut TEN alors ma clé = 1 (PAI_Code_Ligne )
    si cette valeur vaut NET alors ma clé = 2 (PAI_Code_Ligne )
    PEut on faire ça ?
    Si quelqu'un a une réponse merçi

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par xeron33 Voir le message
    si cette valeur vaut TEN alors ma clé = 1 (PAI_Code_Ligne )
    si cette valeur vaut NET alors ma clé = 2 (PAI_Code_Ligne )
    Si tu connais d'avance la valeur des clés pour les valeurs de TYL_LIB_LIGNE alors CASE devrait faire l'affaire (mais je ne l'ai pas testé en sqlloader, juste à priori ça marche)

    Par contre si tu veux récupérer la clé dynamiquement pour gérer sans modification du script sqlloader les nouveaux TYL_LIB_LIGNE alors je pense que les tables externes seront nettement plus flexibles.

  3. #3
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Vous pouvez faire cela de 3 manières différentes:

    1. Utiliser un DECODE dans le control file
    2. Utiliser une fonction que vous pouvez développer vous-même dans le control file
    3. Utiliser un trigger sur la table

    Voici un exemple très rapide sur les 3 cas (faites attention aux types de données de la table t1 qui ne sont pas choisis proprement. Je vous laisse la possibilité de changer cela)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SQL> create table t1 (n1 number , n1_typ varchar2(3));
     
    Table created.
     
    SQL> select * from t1;
     
    no rows selected
    Je prends pour exemple de données le contenu du fichier file2 suivant
    1.Premier cas : utilisation de DECODE dans le control file c2-1.ctl
    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
     
    LOAD DATA
    INFILE 'file2.dat'
    APPEND
    INTO TABLE T1
     FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    TRAILING NULLCOLS
    ( n1,
      n1_typ "DECODE(:n1_typ,'TEN',1,'NET',2)"
     ) 
     
    C:\>sqlldr xxx/xxx@xxx control=c2-1.ctl
    SQL*Loader: Release 10.2.0.3.0 - Production on Wed Jan 16 10:21:32 2013
     
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
     
    Commit point reached - logical record count 1
    Commit point reached - logical record count 2
     
    SQL> select * from t1;
     
            N1 N1_
    ---------- ---
             1 1
             2 2
    2.Deuxième cas : utilisation d’une fonction dans le control file c2-2.ctl

    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
     
    SQL> create or replace function get_id
      2  (piv_n1_type varchar2) return number
      3  is
      4   nl_type_id number;
      5  begin
      6  -- vous pouvez utiliser une table ou
      7  -- tout autre chose dans cette fonction
      8  -- sauf un select sur la table t1
      9  if piv_n1_type = 'TEN'
     10  then
     11      nl_type_id := 1;
     12  elsif piv_n1_type = 'NET'
     13  then
     14     nl_type_id := 2;
     15   --etc...
     16  end if;
     17   return nl_type_id;
     18  end get_id;
     19  /
     
    Function created.
     
    LOAD DATA
    INFILE 'file2.dat'
    APPEND
    INTO TABLE T1
     FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    TRAILING NULLCOLS
    ( n1,
      n1_typ "get_id(:n1_typ)"
     )
     
    SQL> truncate table t1;
     
    Table truncated.
     
    C:\>sqlldr xxx/xxx@xxx control=c2-2.ctl
    SQL*Loader: Release 10.2.0.3.0 - Production on Wed Jan 16 10:21:32 2013
     
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
     
    Commit point reached - logical record count 1
    Commit point reached - logical record count 2
     
    SQL>  select * from t1;
     
            N1 N1_
    ---------- ---
             1 1
             2 2
    3.Troisième cas : utilisation d’un trigger
    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
     
    SQL> create or replace trigger t1_b_i_r_trg
      2  before insert on t1
      3  for each row
      4  begin
      5    if :new.n1_typ = 'TEN'
      6    then
      7       :new.n1_typ := 1;
      8    elsif :new.n1_typ = 'NET'
      9    then
     10       :new.n1_typ := 2;
     11    end if;
     12  
     13  end t1_b_i_r_trg;
     14  /
     
    Trigger created.
     
    LOAD DATA
    INFILE 'file2.dat'
    APPEND
    INTO TABLE T1
     FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    TRAILING NULLCOLS
    ( n1,
      n1_typ
     )
     
    C:\>sqlldr xxx/xxx@xxx control=c2-2.ctl
    SQL*Loader: Release 10.2.0.3.0 - Production on Wed Jan 16 10:21:32 2013
     
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
     
    Commit point reached - logical record count 1
    Commit point reached - logical record count 2
     
    SQL> select * from t1;
     
            N1 N1_
    ---------- ---
             1 1
             2 2
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 755
    Points : 208
    Points
    208
    Par défaut Réponse à Mohamed.Houri
    SUPER et MERCI BEAUCOUP !!!!

    J'ai utilisé votre 1ère méthode (DECODE) qui a marché aussitôt !
    Bravo !
    Maintenant j'ai un autre problème :
    Voilà j'utilise en fait 2 autres tables pour cette base et c'est pour l'une des deux que j'ai un problème : la table TETA :
    Ma base :
    TETA(ETA_C_CODE_EM); clé primaire
    TAGE(AGE_C_MAT_CLIENT,AGE_C_CODE_EH,AGE......,AGE_C_CODE_LIGNE); AGE_C_MAT_CLIENT clé primaire
    TPAI(........,PAI_C_CODE_L);
    Mon fichier TXT est de la forme suivante :
    02001|ENT|15/01/2013|12/12/2012|01/01/2013|4|18573|0|14658
    02001|RUB|076813|89|1

    Pour la 1ère ligne ça marche grâce à votre solution j'alimente les tables TETA(02001) et le reste alimente la table TPAI.
    Pour ce qui est de la 2ème ligne, j'ai un problème car je dois alimenter à nouveau la table TETA (02001) et il connait déjà cette valeur là encore je peux peut-être trouver une astuce tout seul si vous avez une solution n'hésitez pas, mais mon problème vient des autres valeurs qui n'alimentent pas la même table que la ligne 1 car ces valeurs : RUB|076813|89|1 vont dans la table TAGE .
    Alors ma question comment faire dans ce cas quand on a une deuxième ligne qui n'alimente pas la même table que la 1ère ligne ?
    Voilà si vous avez une idée merçi de me le faire savoir et merçi encore
    A +

Discussions similaires

  1. CONCATENATE Dans Sql Loader
    Par impulsion dans le forum SQL*Loader
    Réponses: 0
    Dernier message: 16/10/2014, 15h33
  2. Gestion des exceptions dans sql*loader
    Par sabdoul dans le forum SQL*Loader
    Réponses: 0
    Dernier message: 06/03/2013, 13h00
  3. Réponses: 22
    Dernier message: 04/03/2013, 17h07
  4. [10g]ORA-01008 dans SQL*Loader
    Par isa06 dans le forum SQL
    Réponses: 3
    Dernier message: 11/05/2006, 17h17
  5. Erreur dans SQL*Loader
    Par AkA dans le forum SQL
    Réponses: 6
    Dernier message: 30/03/2006, 12h30

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