Vous êtes sur la page 1sur 4

Chargement de données en SQL Oracle http://www.emi.ac.ma/~ntounsi/COURS/DB/Oracle/sqlldr...

TP SQL-Oracle
Cours BD , sémestre 2, Génie Informatique

Najib Tounsi

Chargement des tables à partir de données


brutes.
Il est très utile (par exemple, remplissage initial d'une table) de charger des
données à partir d'un fichier texte préalablement saisi. L'outil SQLLDR (SQL
LOADER) permet cela. (*)

La ligne commande OS sqlldr.


c:\> SQLLDR USERID=ali/passali, CONTROL=fichier.ctl, DATA=fichier.dat

avec les paramètres:

USERID : identité de l'utilisateur (nom/password)


CONTROL : un fichier de contrôle qui précise la façon dont les données doivent
être chargées dans la base de données
DATA : un fichier de données qui contient les données à charger

Le minimum qu'il faut spécifier c'est un fichier de contrôle.

Exemple 1

Soit la table Oracle:

maTable (num integer, nom varchar(10))

On veut la peupler avec les données:

num nom
1 Ali
2 Fatima
3 Untel

Un fichier de contrôle sample.ctl pourra être:


LOAD DATA
INFILE *
INTO TABLE maTable
FIELDS TERMINATED BY '|'

1 of 4 22/03/17 08:42
Chargement de données en SQL Oracle http://www.emi.ac.ma/~ntounsi/COURS/DB/Oracle/sqlldr...

(num, nom)
BEGINDATA
1|Ali
2|Fatima
3| Untel

Dont voici un cas d'utilisation:


C:\> SQLLDR USERID=ali/passali, CONTROL=\ali\sample.ctl

SQL*Loader: Release 10.2.0.1.0 - Production on Lun. DÚc. 30 11:56:26 2013


Copyright (c) 1982, 2005, Oracle. All rights reserved.
Point de validation (COMMIT) atteint - nombre d'enregis. logiques 3

C:\> sqlplus
SQL> select * from maTable

NUM NOM
------ ----------
1 Ali
2 Fatima
3 Untel

A noter (voir le fichier sample.ctl ci dessus):

INFILE * pour que les données brutes soient lues dans le même fichier (après
BEGINDATA), sinon, un fichier sample.dat (nom par défaut) est cherché.
Une ligne source texte par tuple à insérer. Champs séparés par "|" spécifié par
TERMINATED
La clause FIELDS spécifie les colonnes à remplir en plus du caractère
séparateur des champs
La première ligne LOAD DATA est l'entête.

A noter aussi:

L'espace après un séparateur (3e ligne BEGINDATA) n'est pas ignorée. Le nom
inséré est " Untel" !
De même s'il y a un espace après un nom dans le fichier texte source!

Un fichier rapport sample.log est crée et éventuellement sample.bad pour les lignes
tuples erronées.

Exemple 2

On peut mettre les données dans un fichier séparé. On va rajouter des données
dans la table Oracle maTable. Soit le fichier texte maTable.dat contenant les lignes:
4|Amina
5| Aziz

Un fichier de contrôle sample2.ctl serait:


LOAD DATA
INFILE "\ali\maTable.dat"
APPEND INTO TABLE test
FIELDS TERMINATED BY '|'

2 of 4 22/03/17 08:42
Chargement de données en SQL Oracle http://www.emi.ac.ma/~ntounsi/COURS/DB/Oracle/sqlldr...

(num, nom)

Usage:
C:\> SQLLDR USERID=ali/passali, CONTROL=\ali\sample2.ctl

...

C:\> sqlplus
SQL > select * from test donnera
NUM NOM
------ ----------
1 Ali
2 Fatima
3 Untel
4 Amina
5 Aziz

A noter

INFILE spécifie le fichier contenant les données brutes maTable.dat


Pas de zone BEGINDATA donc.
Clause APPEND INTO pour insérer (en rajoutant) dans la table Oracle.
Intéressant pour ne pas avoir le message "Table non vide". Faire attention à
ne pas insérer des clés doubles.
On pourra aussi utiliser la caractère de contrôle tabulation '\t' comme
séparateur. Ce caractère a toute les chances de ne pas faire partie des données
à insérer.

Remarque

Syntaxe légère :

c:\Ali > sqlldr ali/passali sample

Le 1er argument est USERID, le 2e est CONTROL, extension par défaut .ctl

Si on tape tout simplement

c:\Ali > sqlldr

Il sera demandé de rentrer les paramètres USERID et CONTROL

Autres spécifications utiles

1) Charger des dates formatées. Supposer en plus un champ dateNais de type Date .
Il faut
...
FIELDS TERMINATED BY '|'
(num, nom, dateNais DATE 'dd-mm-yyyy')
BEGINDATA
1|Ali|01-01-1990
2|Fatima|4-1-1998

3 of 4 22/03/17 08:42
Chargement de données en SQL Oracle http://www.emi.ac.ma/~ntounsi/COURS/DB/Oracle/sqlldr...

...

Dans la clause FIELDS on donne le format 'dd-mm-yyyy' pour saisir les dates
comme on souhaite.

2) Champs vide (valeur NULL)

Supposer une table Oracle avec trois colonnes a, b, c entières. Les données :
3||5
|2|4
1||6
||7

donneront les tuples :

< 3, NULL, 5 >


< NULL, 2, 4 >
< 1, NULL, 6 >
< NULL, NULL, 7 >

dans la table.

3) Format CSV (comma separated values)


https://en.wikipedia.org/wiki/Comma-separated_values

On pourra aussi utiliser le format d'échange CSV, avec toujours une ligne par tuple
et les champs séparés par le caractère virgule.
FIELDS TERMINATED BY ','

Pour l'exemple 1) ce-dessus on aura


1,Ali,01-01-1990
2,Fatima,4-1-1998

NB. Bien sûr, la virgule ne doit pas faire partie des données, sinon choisir le point-
virgule qui est aussi un séparateur CSV.

D'autres spécifications existent selon les contraintes du fichier source des données.

Voir http://docs.oracle.com/cd/B19306_01/server.102/b14215
/ldr_control_file.htm#i1004642

Le cas inverse, copier les tables vers des fichiers externes peut-être effectué avec la
commande SQLPLUS spool...

(*) En fait, cet outil SQLLDR permet de migrer des données provenant de
plusieurs type de sources, y compris des fichiers représentant des tables d'autres
BDs.

4 of 4 22/03/17 08:42

Vous aimerez peut-être aussi