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 :

sqlloader, chargement (un peu) complexe


Sujet :

SQL*Loader Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Points : 74
    Points
    74
    Par défaut sqlloader, chargement (un peu) complexe
    Bonjour,


    J'ai cherché dans le forum oracle et je n'ai pas trouvé de solutions, mais je pense qu'il doit y en avoir une.

    Je charge classiquement des données dans une table par sqlloader, l'un des champs doit être renseigné par une certaine valeur (toujours la même) qui peut se trouver dans une variable globale oracle.

    Dans le ctl j'essaie de faire quelque chose comme :

    LOAD DATA
    REPLACE INTO TABLE TOTO
    FIELDS TERMINATED BY ';'
    TRAILING NULLCOLS
    (
    typenr,
    fill1,
    fill2,
    fill3,
    fill4,
    fill5,
    PERIODE "&1"
    )

    où &1 serait la variable globale, (ou si on pouvait passer ce paramètre à sqlloader directement ce serait aussi bien !).

    Bon ça ne fonctionne pas ainsi, que faire pour que ça marche ?

    Ca se passe avec oracle 10g

    Cordialement.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Points : 74
    Points
    74
    Par défaut
    pas de solutions ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Points : 74
    Points
    74
    Par défaut
    et supposons que la valeur à renseigner se trouve dans le 1er enregistrement, peut-on la récupérer et la mettre dans les autres enr. ?

  4. #4
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 176
    Points : 126
    Points
    126
    Par défaut
    Si j'etais toi, je ferais une mise a jour du champs 'PERIODE' de ma table 'TOTO', apres l'avoir charger
    ca peut etre une solution

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par jejam
    Si j'etais toi, je ferais une mise a jour du champs 'PERIODE' de ma table 'TOTO', apres l'avoir charger
    ca peut etre une solution
    Je ferais bien ça, mais je perds le bénéfice du append/replace, la 'PERIODE' faisant partie de la clé de la table, le update planterait s'il y avait déjà des enr. ayant cette clé.

    Cordialement

  6. #6
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    Regarde cet exemple
    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
    Can one modify data as it loads into the database?
    Data can be modified as it loads into the Oracle Database. Note that this only applies for the conventional load path and not for direct path loads. 
       LOAD DATA
       INFILE *
       INTO TABLE modified_data
       (  rec_no                      "my_db_sequence.nextval",
          region                      CONSTANT '31',
          time_loaded                 "to_char(SYSDATE, 'HH24:MI')",
          data1        POSITION(1:5)  ":data1/100",
          data2        POSITION(6:15) "upper(:data2)",
          data3        POSITION(16:22)"to_date(:data3, 'YYMMDD')"
       )
       BEGINDATA
       11111AAAAAAAAAA991201
       22222BBBBBBBBBB990112
     
       LOAD DATA
       INFILE 'mail_orders.txt'
       BADFILE 'bad_orders.txt'
       APPEND
       INTO TABLE mailing_list
       FIELDS TERMINATED BY ","
       (  addr,
          city,
          state,
          zipcode,
          mailing_addr   "decode(:mailing_addr, null, :addr, :mailing_addr)",
          mailing_city   "decode(:mailing_city, null, :city, :mailing_city)",
          mailing_state
       )
    Source : http://www.orafaq.com/faqloadr.htm

    Et tente de faire appel à une fonction qui retourne ta période

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Points : 74
    Points
    74
    Par défaut
    oops, ça a l'air sympa !
    Dans BeginData, je mettrais la fonction qui retourne la période ?

    Ou plutot, dans les valeurs affectés aux champs je pourrais faire appel à une fonction qui retourne la période ?

    Je vais essayer, mais j'ai plusieurs fers sur le feu, je vous tiens au courant.

    Cordialement.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Points : 74
    Points
    74
    Par défaut
    Je ne pense pas que la solution préconisée fonctionne. Il faudrait pouvoir passer un paramètre fonctionnel à sqlloader : ce n'est pas possible (sqlloader ne prend que ses paramètres standards).

    Donc je ne pense pas qu'il y ait une solution au problème, ou effectivement passer par l'appel d'une fonction et faire qq chose comme :
    {
    .
    .
    .
    PERIODE "pack_toto.fct"
    .
    .
    .
    }

    pack_toto.fct ferait un accès bd, ce qui est lourd (pour 1 million d'enr. 1 million d'accès bd...).

    Donc voila, si pas possible de passer un paramètre fonctionnel à sqlloader, son utilisation n'est pas intéressante (dans ce cas).

    Cordialement

  9. #9
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    Comme détermines tu la période ?

    Peut elle être calculée ?
    exemple période = Trimestre = to_char(sysdate,'Q')

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Points : 74
    Points
    74
    Par défaut
    non elle ne peut-être calculée.
    En fait j'ai réussi à résoudre ce problème.

    En fait la période se trouve dans l'enr. d'entête (1er enr. du fichier), je la récupère dans une variable globale (et je la met également dans cet enr.) et je la met dans les enr. suivants.

    Ca donne dans le 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
    LOAD DATA
    APPEND INTO TABLE TOTO
    FIELDS TERMINATED BY X'02'
    TRAILING NULLCOLS
    (
    	typenr,
    	fill1,
    	fill2,
    	fill3,
    	fill4,
    	fill5,
    	fill6,
    	periode "DECODE(:typenr, '01', PAC.GETPERIODE(:fill5), PAC.GETPERIODE)"
    )
    Il y a surcharge de la fonction GETPERIODE, celle avec le paramètre set et get la variable globale, celle sans paramètre retourne la variable globale.

    Ca marche ! Mais c'est dommage qu'on ne puisse passer des paramètres fonctionnels à sqlloader.

    Cordialement.

  11. #11
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    content pour toi

    peux tu mettre le tag ? Merci d'avance

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gérer un Formulaire un peu complexe pour moi
    Par budylove dans le forum Langage
    Réponses: 3
    Dernier message: 17/05/2006, 10h01
  2. Un Alignement un peu complexe
    Par Jeskor dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 27/04/2006, 17h04
  3. Requête de sélection un peu complexe
    Par new_wave dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 03/01/2006, 14h44
  4. sqlloader: chargement complexe
    Par slefevre01 dans le forum SQL*Loader
    Réponses: 3
    Dernier message: 06/10/2005, 11h20
  5. Requete un peu complexe avec la fonction IN
    Par Taichin dans le forum Oracle
    Réponses: 27
    Dernier message: 10/11/2004, 08h59

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