Introduction

SQL*Loader est un utilitaire fourni avec Oracle permettant de charger des données dans des tables Oracle depuis des fichiers plats. Le schéma ci-dessous présente le principe de SQL*Loader.

sqlloader.png

En entrée, SQL*Loader prend un fichier de contrôle ( rien à voir avec le fichier de contrôle de la base de données ) qui pilote le chargement, et un ou plusieurs fichiers de données ASCII.

En sortie, SQL*Loader alimente la base de données Oracle et génère un fichier journal (log), un fichier des rejets (bad - données erronées) et un fichier des refus (discard - données écartées).

Le fichier bad contient des enregistrements qui ont été rejetés par SQL*Loader (format de l’enregistrement non valide par rapport à la description du fichier de contrôle)

Le fichier discard contient les enregistrements rejetés par Oracle (violation d’une contrainte d’intégrité, type de données non valide, etc.).

Les enregistrements rejetés ou refusés sont écrits tels quels dans les fichiers bad et discard qui ont donc, la même structure que les fichiers de données utilisés en entrée ; après correction éventuelle des enregistrements, les fichiers bad et discard peuvent être utilisés comme fichiers d’entrée.

Ce billet présente une insertion via SQL*Loader avec des dates. Ce type de données peut parfois poser des soucis si le fichier de contrôle n'est pas correctement paramétré.

Fichier des données

Ci dessous le fichier à intégrer-> personnes.txt

code|prenom|nom|adr|datenais
10|Walker|Tyler|CP 192, 3418 Magna Ave|30/11/1948 02:49:10,101010
15|Lacota|Yates|391 Nisi. Ave|05/07/1969 21:35:55,555555
20|Patricia|Briggs|Appartement 758-7764 Cras Rd.|12/07/1957 08:28:46,464646
25|Aileen|Wiggins|4078 Libero Av.|06/07/1947 16:36:46,464646
30|Rhiannon|Bender|308 Commodo Chemin|25/07/1965 15:52:58,585858
35|Keith|Simpson|Appartement 839-742 Hendrerit. Ave|04/11/1963 04:52:13,131313
40|Jesse|Baker|343-1474 Vestibulum. Rue|25/07/1965 19:53:08,080808
45|Hilel|Fuentes|6993 Taciti Chemin|19/03/1967 17:09:41,414141
50|Bradley|Carroll|9347 Malesuada Chemin|23/11/1965 14:48:21,212121
55|Bianca|Rodriguez|Appartement 964-8829 Hymenaeos. Rue|22/11/1953 12:29:16,161616

La particularité est ici que le champ datenais est au format Oracle timestamp. La table personnes est donc créée ainsi :

create table personnes ( code number(2), prenom varchar2( 15 char ), nom varchar2( 15 char), adr varchar2( 40 char ), datenais timestamp );

Fichier de contrôle

Ci dessous le fichier de contrôle SQL*Loader

options (skip=1)
load data 
truncate
into table personnes
fields terminated by '|'
( code,
prenom,
nom,
adr,
datenais timestamp 'DD/MM/YYYY HH24:MI:SS,FF6' )

La clause options permet de ne pas tenir compte des entêtes de colonnes.

La ligne datenais permet de définir comment la date est structurée dans le fichier d'origine.

Chargement

Une fois correctement établi le fichier de contrôle le chargement est simple

sqlldr userid=alice/ecila data=personnes.txt control=personnes.ctl log=personnes.log bad=personnes.bad discard=personnes.discard

Il est bien entendu possible de passer via un fichier de paramètres et la clause parfile.

Fichier de paramètres -> personnes.load

userid=alice/ecila
control=personnes.ctl
log=personnes.log
bad=personnes.bad
discard=personnes.discard

Lancement

sqlldr parfile=personnes.load

Note relatif à la langue

Dans certains cas il peut être intéressant de modifier la langue dans laquelle est générée la trace. Ceci se fait en modifiant correctement la variable NLS_LANG.

Trace en anglais :

export NLS_LANG=AMERICAN_AMERICA.UTF8
 sqlldr alice/ecila data=personnes.txt control=personnes.ctl log=personnes.english.log bad=personnes.bad discard=personnes.discard

SQL*Loader: Release 12.1.0.2.0 - Production on Sun Nov 25 18:20:17 2018

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Path used:      Conventional
Commit point reached - logical record count 10

Table PERSONNES:
  10 Rows successfully loaded.

Check the log file:
  personnes.english.log
for more information about the load.

Traces en français.

export NLS_LANG=FRENCH_FRANCE.UTF8
sqlldr alice/ecila data=personnes.txt control=personnes.ctl log=personnes.francais.log bad=personnes.bad discard=personnes.discard

SQL*Loader: Release 12.1.0.2.0 - Production on Dim. Nov. 25 18:20:39 2018

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Chemin utilisé:      Classique
Point de validation (COMMIT) atteint - nombre d'enregis. logiques 10

Table PERSONNES :
  10 Lignes - Chargement terminé.

Pour plus d'informations sur le chargement, consultez le fichier journal :
  personnes.francais.log

La définition correcte dans le fichier de contrôle du champ datenais est alors primordial, car les américains ne représentent pas les dates comme la France.