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 18/09/2006, 16h37   #1
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 133
Points : 32
Points : 32
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.
fguigui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2006, 09h03   #2
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 133
Points : 32
Points : 32
pas de solutions ?
fguigui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2006, 13h30   #3
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 133
Points : 32
Points : 32
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. ?
fguigui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2006, 14h15   #4
Membre régulier
 
Inscription : août 2004
Messages : 176
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 176
Points : 90
Points : 90
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
jejam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2006, 14h33   #5
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 133
Points : 32
Points : 32
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
fguigui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2006, 17h36   #6
Membre éclairé
 
Inscription : septembre 2003
Messages : 432
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 432
Points : 326
Points : 326
Regarde cet exemple
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
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
sygale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2006, 18h21   #7
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 133
Points : 32
Points : 32
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.
fguigui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 19h12   #8
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 133
Points : 32
Points : 32
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
fguigui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2006, 12h06   #9
Membre éclairé
 
Inscription : septembre 2003
Messages : 432
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 432
Points : 326
Points : 326
Comme détermines tu la période ?

Peut elle être calculée ?
exemple période = Trimestre = to_char(sysdate,'Q')
sygale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2006, 13h14   #10
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 133
Points : 32
Points : 32
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 :
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.
fguigui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2006, 16h51   #11
Membre éclairé
 
Inscription : septembre 2003
Messages : 432
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 432
Points : 326
Points : 326
content pour toi

peux tu mettre le tag ? Merci d'avance
sygale est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h32.


 
 
 
 
Partenaires

Hébergement Web