Le chargeur SQL loader

 

SQL*Loader est, comme son nom l'indique un utilitaire de chargement spécifique pour les bases Oracle. Il permet d'initialiser une base de données, ou plus précisément une ou plusieurs tables avec des données issues d'un fichier texte.
Ainsi si l'on souhaite migrer des données d'un fichier Mainframe vers Oracle, on pourra extraire les données du fichier d'origine pour produire un fichier texte et ensuite utiliser SQL*loader pour effectuer le chargement automatique de la (ou des) table(s).

Principales caractéristiques

- charge des fichiers texte externes dans Oracle
- format des fichiers d'entrée fixe ou variable (avec séparateur)
- utilisation de fonctions SQL
- génération de clés uniques
- mode "direct" optimisé
- gestion des logs, des erreurs et possibilité de reprise

Principe général

La (ou les) table(s) destination sont créées dans le schéma cible.
On précise le format des entrées et des sorties dans un fichier de paramétrage, appelé fichier de contrôle, créé avec un éditeur de texte. Un fichier log donnant les résultats du chargement est généré. En cas d'erreur, les enregistrements rejetés sont stockés dans un fichier '.bad', pour être éventuellement retraités.
Commande minimale :
sqlldr nom_user/mot_de_passe@base control=nom_fic.ctl
 
La structure de la table cible doit être créée avant le chargement, SQL*Loader à la différence d'autres outils ne crée pas la table.

Options de la ligne de commandes

option
description
Defaut
userid
username et mot de passe

control
nom du fichier de controle du loader

data
nom du fichier de données d'entrée

log
nom du fichier de trace

bad
nom du fichier des enregistrements rejetés

parfile
nom du fichier contenant les parametres de la commande...

skip n
nombre d'enregistrement logiques à sauter
0
load n
nombre à charger
all
errors n
nombre max d'erreurs autorisées
50
rows n
nb de lignes du tableau utilisé pour les entrées
64
bindsize
taille du tableau précédent en bytes
OSdep
silent
n'affiche plus les messages pendant l'execution

direct
utilise l'accès direct (direct path)
false
parrallel
chargement en mode parrallelisé
false
file
fichier d'allocation pour les chargement parralleles

discard
fichier des enregistrements non chargés intentionnellement (saut conditionnel)

discardmax
nombre maximums de ces enregistrements non chargés
all

Mode de chargement

insert insère les datas dans une table vide
append insère les datas à la suite des données existantes
replace insère les datas en remplaçant les données existantes
truncate insère les datas après un TRUNCATE
 
Exemple :
Table FS_SIZE_JOUR
create table FS_SIZE_JOUR
       ( INSTANCE_NAME  VARCHAR2(20) not null ,
         DATE_FS        DATE not null ,
         FSSIZE         VARCHAR2(20) not null  )  ;
 create  unique index PK_FS_SIZE_JOUR on FS_SIZE_JOUR( INSTANCE_NAME, DATE_FS ) ;

Fichier de données à insérer dans la table fsdata.txt
Séparateur virgule
Serveur1,2008/10/21,4536.000000,
Serveur2,2008/10/21,60865.000000,
Serveur3,2008/10/21,83653.000000,
Serveur4,2008/10/21,33440.000000,
Serveur5,2008/10/21,83693.000000,
 
Fichier de control SQLLOADER : 

 LOAD DATA INFILE 'fsdata.txt'
APPEND INTO TABLE FS_SIZE_JOUR
FIELDS TERMINATED BY ','
( INSTANCE_NAME  ,
  DATE_FS               DATE "YYYY/MM/DD"  ,
  FSSIZE "ceil(:FSSIZE)"  )

Lancement du SQLLOADER :

sqlldr userid=toto/titi  control=fsdata.ctl   log=fsdata.lo bad=fsdata.bad   discard=fsdata.dis   errors=0

Insertion de champs par rapport à des positions dans le fichier :

Dans cette exemple , les champs ne sont pas séparé pas un caractère mais contiennent des positions fixes 
LOAD DATA INFILE 'fsdata.txt'
APPEND INTO TABLE FS_SIZE_JOUR
FIELDS TERMINATED BY ','
( INSTANCE_NAME  POSITION(01:20) ,
  DATE_FS               POSITION(21:30)   DATE "YYYY/MM/DD"  ,
  FSSIZE                 POSITION(31:50) "ceil(:FSSIZE)"   )

Tuning Data Loads
 
Si vous avez de gros chargement, il n’est peut être pas nécessaire  de générer de gros fichiers RELO LOG pour des données qui peuvent être rechargées à tout moment.  Pour cela utiliser le mot clef : 
UNRECOVERABLE  en conjonction avec l’option DIRECT=TRUE, 

 OPTIONS (DIRECT=TRUE ERRORS=10000 SILENT=(ERRORS, FEEDBACK)
UNRECOVERABLE
LOAD DATA INFILE 'fsdata.txt'
APPEND INTO TABLE FS_SIZE_JOUR
FIELDS TERMINATED BY ','
( INSTANCE_NAME  POSITION(01:20) ,
  DATE_FS               POSITION(21:30)   DATE "YYYY/MM/DD"  ,
  FSSIZE                 POSITION(31:50) "ceil(:FSSIZE)"   )

commande : sqlldr userid=toto/titi  control=fsdata.ctl   log=fsdata.lo bad=fsdata.bad   discard=fsdata.dis  errors=0

 L'option rows=n avec n positionné à une grande valeur permet de faire descommit moins fréquent. Vous pouvez aussi désactiver les indexes et contraintes le temps du chargement.