Sql*Loader : Comment effectuer des chargements de données sous Oracle

Charger des données provenant d'un fichier
(Cet article couvre les versions 8 à 10G)

Article lu   fois.

L'auteur

Profil Pro

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Préface

Dans un premier temps nous nous attellerons à détailler l'outil SQL*LOADER ainsi que ses différentes options ensuite nous verrons concrètement l'utilité de cet outil par un exemple simple.

Ici il s'agit d'un tutorial de prise en main rapide de l'outil. Pour les cas plus complexe, je vous renvoie à la documentation.

II. Introduction

SQL LOADER ou sqlldr est un exécutable binaire qui permet le chargement de données à partir de fichiers plats et à destination d'Oracle.

Il est présent dans le répertoire suivant :
Unix : $ORACLE_HOME/bin/

Windows : %ORACLE_HOME%\bin

Exemple sous Unix ( HP PA RISC )

 
Sélectionnez
$ cd $ORACLE_HOME/bin
$ ls -ltr sqlldr 
-rwxr-x--x   1 oracle     dba         572928 Nov 12  2003 sqlldr

Cependant en fonction de la plate-forme du système d'exploitation et de la version d'oracle le binaire SQL*LOADER peut avoir différents noms :

      Version    
Plateforme 7.3.X 8.0.X 8.1.X 9.0.X 9.2.X
Windows SQLLDR73.EXE SQLLDR80.EXE SQLLDR.EXE SQLLDR.EXE SQLLDR.EXE
UNIX sqlldr sqlldr sqlldr sqlldr sqlldr
VMS SQLLDR.EXE SQLLDR.EXE SQLLDR.EXE SQLLDR.EXE SQLLDR.EXE
MVS sqlldr sqlldr sqlldr sqlldr sqlldr
Netware SQLLOAD.NLM SQLLDR80.NLM SQLLDR81.NLM N/A N/A

III. SQL*LOADER

III-A. Comment appeler sqlldr ?

En fonction du nom de l'exécutable, on va ouvrir une fenêtre de commande et l'appeler en tapant tout simplement sqlldr.
S'il n'y a pas d'argument on fait appel à l'aide en ligne.

 
Sélectionnez
SQL*Loader: Release 9.2.0.1.0 - Production on Lu Sep 12 15:03:01 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


Syntaxe : SQLLDR keyword=value [,keyword=value,...]!

Notons que pour pouvoir appeler l'outil ainsi il est primordial que le chemin $ORACLE_HOME/bin apparaisse dans le PATH ou alors que ce dernier soit positionné avant l'appel.

III-B. Comment marche sqlldr

Comme nous le voyons nous allons fournir un fichier de données, et un fichier de contrôle qui nous permette de contrôler le chargement des données. Nous allons avoir outre le chargement des données un fichier de LOG, un fichier DISCARD et un fichier BAD ( si ces derniers sont paramétrés).

Image non disponible

III-B-1. Le fichier de contrôle

Le fichier de contrôle est un fichier qui est écrit dans le « langage SQLLOADER ». Il va nous permettre de :

  • Décrire les actions que Sql*Loader doit effectuer.
  • Trouver les données à charger
  • Effectuer une analyser syntaxique et interpréter les données.
  • Insérer les données.
  • (…)

III-B-2. Le fichier de données

Image non disponible C'est un fichier plat ( csv, txt … ) qui stocke les données et les séparateurs.

III-B-3. Le fichier : Bad Files

Image non disponible Il contient les enregistrements qui ont été rejeté soit par SQL*LOADER soit par Oracle. En effet le processus de chargement se déroule ainsi : Sql*Loader lit les lignes une à une puis les envoie à Oracle.
Si une ligne venait à ne pas être conforme pour SQLLOADER celle ci serait rejetée et un fichier bad file serait crée ou alimenté s'il est déjà crée.
Lorsque la ligne parvient à Oracle, celui ci va voir si son insertion est possible ou pas en fonction de clé primaire, contrainte, définition de la colonne ?
S'il apparaît que la ligne n'est pas en conformité avec cela alors Oracle va rejeter la ligne en suivant la même procédure que Sql*Loader.

Comme le fichier BAD est généré comme le fichier de données, vous pouvez après avoir déterminé et solutionné le problème effectué un nouveau chargement avec uniquement les données contenues dans le BAD FILE.

III-B-4. Le fichier : Discard Files

Image non disponible Le fichier DISCARD peut être spécifié lors l'appel de la commande ou alors directement dans le fichier contrôle.
Ce fichier est crée uniquement sur demande explicite et détaille les enregistrements qui n'ont pas été retenu par Sql*Loader.
En effet si dans le fichier de contrôle on spécifie une clause pour filtrer les données et que Sql*Loader détecte des lignes qui ne sont pas en conformité avec cette clause, elle les stocke dans le ficher DISCARD.

III-C. Le fichier Log : Log files

Image non disponible Le loader d'oracle va à chaque exécution du binaire produire un fichier log ou comme dans tout fichier log il va effectuer un résumé des actions :

  • Information d'entête : Date d'exécution et numéro de version de l'outil.
  • Information globale : Nom des fichiers en entrée et sortie. Arguments des commandes. Spécification de caractère de suite.
  • Information sur la table : (nom de la table, condition de chargement, spécification d'insertion ( INSERT, APPEND, REPLACE ? ), détail des colonnes de la tables.
  • Information sur les fichiers de données(erreurs lors des chargements, données écartées).
  • Information sur les données insérées. ( Nombre d'insertion, nombre de rejet, nombre d'erreurs ).
  • Quelques statistiques : Espace utilisé, Total elapsed time, Total CPU time…

III-D. Les paramètres de Sql*Loader

Afin de connaître les différents paramètres de Sql*Loader il suffit de taper sqlldr sur l'invite de commande.

 
Sélectionnez
C:\>sqlldr

SQL*Loader: Release 9.2.0.1.0 - Production on Lu Sep 12 15:55:34 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


Syntaxe : SQLLDR keyword=value [,keyword=value,...]

Mots-clÚs valides :

    userid -- ORACLE username/password
   control -- Control file name
       log -- Log file name
       bad -- Bad file name
      data -- Data file name
   discard -- Discard file name
discardmax -- Number of discards to allow          (Tous par dÚfaut)
      skip -- Number of logical records to skip    (0 par dÚfaut)
      load -- Number of logical records to load    (Tous par dÚfaut)
    errors -- Number of errors to allow            (50 par dÚfaut)
      rows -- Number of rows in conventional path bind array or between direct p
ath data saves
      (Par defaut: AccÞs conventionnel: 64, AccÞs direct: tous)
  bindsize -- Size of conventional path bind array in bytes  (256000 par dÚfaut)

    silent -- Suppress messages during run (header,feedback,errors,discards,part
itions)
    direct -- use direct path                      (FALSE par dÚfaut)
   parfile -- parameter file: name of file that contains parameter specification
s
  parallel -- do parallel load                     (FALSE par dÚfaut)
      file -- File to allocate extents from
skip_unusable_indexes -- disallow/allow unusable indexes or index partitions  (F
ALSE par dÚfaut)
skip_index_maintenance -- do not maintain indexes, mark affected indexes as unus
able  (FALSE par dÚfaut)
  readsize -- Size of Read buffer                  (1048576 par dÚfaut)
external_table -- use external table for load; NOT_USED, GENERATE_ONLY, EXECUTE
 (NOT_USED par dÚfaut)
columnarrayrows -- Number of rows for direct path column array  (5000 par dÚfaut
)
streamsize -- Size of direct path stream buffer in bytes  (256000 par dÚfaut)
multithreading -- use multithreading in direct path
 resumable -- enable or disable resumable for current session  (FALSE par dÚfaut
)
resumable_name -- text string to help identify resumable statement
resumable_timeout -- wait time (in seconds) for RESUMABLE  (7200 par dÚfaut)

Nous allons uniquement détailler les paramètres les plus utilisés, pour les autres une simple recherche sur la documentation officielle répondra à vos questions.

Userid Nom de l'utilisateur et mot de passe Oracle
Control Chemin complet du fichier de contrôle.
Log Chemin complet du fichier de contrôle.
Data Chemin complet du fichier de données.
Bad Chemin complet du fichier BAD.
Discard Chemin complet du fichier DISACRD.
Discardmax Nombre maximum d'enregistrement dans le fichier Discard H
Skip Nombre maximum d'enregistrement à « sauter ».
Load Nombre maximum d'enregistrement à insérer
Errors Nombre maximum d'enregistrement en erreurs ( ce paramètre doit être à 0 sauf cas particulier).
Silent Sql*Loader est affiché en mode silence ( pas d'affichage à l'écran).
Direct Insertion en Mode Direct
Bindesize taille du tableau précédent en bytes
Parrallel Effectuer des chargements en parallèles.

mode de chargement :

  • insert : insère les données dans une table vide
  • append : insère les données à la suite des données existantes
  • replace : insère les données en remplaçant les données existantes
  • truncate : insère les données après un TRUNCATE ( ici cette solution peut être utile pour faire diminuer le HWM ).

III-D-1. Le paramètre Direct

Nous allons détailler cette option qui peut parfois être utile :
L'insertion par chemin direct fait l'analyse syntaxique des données d'entrée selon les spécifications des champs, convertit les données d'entrée en colonne datatype et construit un tableau de colonne.
On passe le tableau de colonne au « bloc formatter », qui crée des blocs de données sur le format de bloc de base de données d'Oracle.
Les blocs de base de données nouvellement formatés sont écrits directement dans la base de données
Contournant ainsi la plupart de traitement de RDBMS( journalisation des données dans les REDO LOGS ? ) .
L'insertion par chemin direct est beaucoup plus rapide que l'insertion par chemin conventionnel, mais entraîne plusieurs restrictions.
Elle enlève également la possibilité d'avoir une restauration de ces données puisque que par extension les données ne seront pas présentes dans les fichiers REDO et d'archives.

L'option direct peut être également comporter quelques effets de bord. En effet lors de l'insertion par ce mode Oracle ne va pas chercher à déterminer quels sont les blocs libres mais va insérer les données au-dessus du High Water Mark(HWM). C'est pourquoi il faut, lorsque nous insérons les données dans une table de travail, utiliser l'option TRUNCATE.

Les restrictions à l'utilisation du chargement direct :

  • Tables non clusterisées.
  • Pas de transactions actives sur les tables concernées ( on peut vérifier cela on contrôlant les verrous sur la table ).
  • Pas de restrictions SQL dans le fichier de contrôle

Ces fonctionnalités ne sont utilisables avec l'option DIRECT PATH :

  • LOBs
  • VARRAY
  • nested tables
  • REF colonne
  • Fonctions dans le fichier de contrôle
  • (…)

IV. Exemple

Nous allons illustrer notre documentation par un petit exemple concret.

IV-A. Préparation

IV-B. Création de la table

 
Sélectionnez
SQL> create table DVP_loader ( nom varchar2(20) , salaire  number ) ; 

Table cré

IV-C. Création du fichier de données

Nous allons créons un fichier de données, à la main, recensant les différents membres de DVP et leur salaire.

 
Sélectionnez
Jaouad;100
orafrance;200
léoanderson;300
bouyao;400
Nuke_y;500
sheikyerbouti;600
pomalaix;700
titides;800
aline;900
denisys;1000
niourk;1100

IV-D. Création du fichier de contrôle

Nous allons insérer les données dans la table créée en mode direct :

 
Sélectionnez
LOAD DATA INFILE 'data.csv'
TRUNCATE
INTO TABLE DVP_LOADER 
FIELDS TERMINATED BY ';'
(  NOM ,          
 SALAIRE        
)

IV-E. Création de la commande de chargement

 
Sélectionnez
C:\load>sqlldr userid=formation/formation control=control.txt log=log.txt bad=bad.txt discard=disard.txt direct=y errors=0

Nous avons paramétré le seuil de tolérance d'erreurs à 0 afin de s'assurer que nous insérons toutes les données.

IV-F. Résultat

Voyons un peu le résultat :

 
Sélectionnez
SQL> SELECT bytes/1024 taille_ko   FROM dba_segments 
  2  WHERE segment_name ='DVP_LOADER' AND  owner ='FORMATION' 
  3  ;

 TAILLE_KO
----------
       192

Cette table n'est pas vide.
Comme nous utilisons l'option TRUNCATE, la taille de la table devrait diminuer ( et de fait son HWM).

 
Sélectionnez
C:\load>sqlldr userid=formation/formation control=control.txt log=log.txt bad=ba
d.txt discard=disard.txt direct=y errors=0

SQL*Loader: Release 9.2.0.1.0 - Production on Lu Sep 12 18:00:14 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


Chargement terminÚ - calcul enregistrement(s) logique(s) 11.

C:\load>`

Voyons ce que donne le HWM :

 
Sélectionnez
SQL> analyze table formation.DVP_LOADER compute statistics ; 

Table analysée.

SQL> select count (*) from formation.DVP_LOADER ;

  COUNT(*)
----------
        11

SQL> r
  1  SELECT bytes/1024 taille_ko   FROM dba_segments
  2* WHERE segment_name ='DVP_LOADER' AND  owner ='FORMATION'

 TAILLE_KO
----------
        64

SQL>

Fichier LOG :

 
Sélectionnez
SQL*Loader: Release 9.2.0.1.0 - Production on Lu Sep 12 18:00:14 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Fichier de contrôle :   control.txt
Fichier de données :      data.csv
  Fichier BAD :     bad.txt
  Fichier DISCARD : disard.txt
 (Allouer tous les rebuts)

Nombre à charger : ALL
Nombre à sauter: 0
Erreurs permises: 0
Continuation :    aucune spécification
Chemin utilisé:      Direct

Table DVP_LOADER, chargé à partir de chaque enregistrement physique.
Option d'insertion en vigueur pour cette table : TRUNCATE

   Nom de colonne               Position   Long.  Séparat. Encadrem. Type de données
------------------------------ ---------- ----- ---- ---- ---------------------
NOM                                 FIRST     *   ;       CHARACTER            
SALAIRE                              NEXT     *   ;       CHARACTER            


Table DVP_LOADER :
  Chargement réussi de 11 Lignes.
  0 Lignes chargement impossible dû à des erreurs de données.
  0 Lignes chargement impossible car échec de toutes les clauses WHEN.
  0 Lignes chargement impossible car tous les champs étaient non renseignés.

Taille du tableau de liens non utilisée dans le chemin direct.
Lignes de tableau de colonnes :    5000
Octets de tampon de flux de données :  256000
Octets de tampon de lecture : 1048576

Nombre total d'enregistrements logiques ignorés :          0
Nombre total d'enregistrements logiques lus :            11
Nombre total d'enregistrements logiques rejetés :         0
Nombre total d'enregistrements logiques mis au rebut :        0
Nombre total de tampons de flux de données chargés par le thread principal de SQL*Loader :        2
Nombre total de tampons de flux de données chargés par le thread de chargement de SQL*Loader :        0

Le début de l'exécution a été effectué sur Lu Sep 12 18:00:14 2005
La fin de l'exécution a été effectuée sur Lu Sep 12 18:00:14 2005

Table DVP_LOADER :

 
Sélectionnez
SQL> select * from dvp_loader ;

NOM                     SALAIRE
-------------------- ----------
Jaouad                      100
orafrance                   200
léoanderson                 300
bouyao                      400
Nuke_y                      500
sheikyerbouti               600
pomalaix                    700
titides                     800
aline                       900
denisys                    1000
niourk                     1100

11 ligne(s) sélectionnée(s).

V. Sql*Loader FAQ

Bienvenue dans la partie FAQ de Sql*Loader, elle a pour but de répondre à quelques questions courantes que vous vous posez fréquemment.

V-A. Comment éviter de charger la première ligne

Data.csv 
Sélectionnez
Nom;Salaire
Jaouad;100
orafrance;200
léoanderson;300
bouyao;400

Ici nous désirons ne pas insérer la première ligne qui correspond aux colonnes.
Commande :

 
Sélectionnez
C:\load
>sqlldr userid=formation/formation control=control.txt log=log.txt bad=bad.txt discard=disard.txt direct=y errors=0 skip=1

Le paramètre SKIP=1 permet d'ignorer la première ligne.
D'ailleurs nous retrouvons cette d'information dans le fichier LOG:

 
Sélectionnez
Nombre total d'enregistrements logiques ignorés :          1
Nombre total d'enregistrements logiques lus :            11

V-B. Comment filtrer les chargements

Si nous ne voulons pas intégrer toutes les données mais uniquement certaines.
On modifie le fichier de contrôle pour charger toutes les lignes sauf celle concernant Jaouad:

 
Sélectionnez
LOAD DATA INFILE 'data.csv'
TRUNCATE
INTO TABLE DVP_LOADER 
when (1:6) <> 'Jaouad' 
FIELDS TERMINATED BY ';'
(  NOM ,          
 SALAIRE        
)

Le fichier Log :

 
Sélectionnez
Table DVP_LOADER, chargé quand 1:6 != 0X4a616f756164(caractère 'Jaouad')
Option d'insertion en vigueur pour cette table : TRUNCATE

   Nom de colonne               Position   Long.  Séparat. Encadrem. Type de données
------------------------------ ---------- ----- ---- ---- ---------------------
NOM                                 FIRST     *   ;       CHARACTER            
SALAIRE                              NEXT     *   ;       CHARACTER            

Enregistrement 1 : Rejeté - échec de toutes les clauses WHEN.
1

V-C. Comment exporter des données d'Oracle

Comment effectuer une extraction d'une table Oracle pour alimenter une autre instance Oracle avec Sql*Loader :

 
Sélectionnez
SQL> desc dvp_loader 
 Nom                                       NULL ?   Type
 ----------------------------------------- -------- ----------------------------
 NOM                                                VARCHAR2(20)
 SALAIRE                                            NUMBER

SQL> set echo off newpage 0 space 0 pagesize 0 feed off head off trimspool on
SQL> spool c:\load\data2.csv 
SQL> select nom||';'||salaire from  dvp_loader ;
Jaouad;100
orafrance;200
léoanderson;300
bouyao;400
Nuke_y;500
sheikyerbouti;600
pomalaix;700
titides;800
aline;900
denisys;1000
niourk;1100
SQL> spool off ;
SQL>

Le fichier data2.csv est prêt à être chargé.

V-D. Comment charger les mêmes données dans plusieurs tables

Ici on va séparer les enregistrements des fichiers dans deux tables différentes :
Les nom dans la table dvp_loader et les salaires dans la table dvp2_loader.
Changer le fichier de contrôle :

 
Sélectionnez
LOAD DATA INFILE 'data.csv'
INTO TABLE DVP_LOADER 
FIELDS TERMINATED BY ';'
 (  
NOM         
)  
INTO TABLE DVP2_LOADER 
FIELDS TERMINATED BY ';'
 TRAILING NULLCOLS
(   
      
 b  
)

Lancer la commande.
Le résultat :

 
Sélectionnez
SQL> select * from dvp_loader ; 

NOM                     SALAIRE
-------------------- ----------
Jaouad
orafrance
léoanderson
bouyao
Nuke_y
sheikyerbouti
pomalaix
titides
aline
denisys
niourk

11 ligne(s) sélectionnée(s).

SQL> select * from dvp2_loader  ; 

A                             B
-------------------- ----------
                            100
                            200
                            300
                            400
                            500
                            600
                            700
                            800
                            900
                           1000
                           1100

11 ligne(s) sélectionnée(s).

V-E. Comment charger des données et les valeurs d'une séquence

Préparer l'environnement :

 
Sélectionnez
SQL> CREATE SEQUENCE dvp_seq
  2           START WITH 1
  3      INCREMENT BY 1;

Séquence créée.

SQL> create table dvp3_loader  ( id number , nom varchar2(20) , salaire number ) ; 

Table créée.

Modifier le fichier de contrôle.

 
Sélectionnez
LOAD DATA INFILE 'data.csv'
INTO TABLE DVP3_LOADER 
FIELDS TERMINATED BY ';'
 (id  "dvp_seq.nextval",
 NOM ,          
 SALAIRE        
)

Voilà le résultat.

 
Sélectionnez
SQL> select * from dvp3_loader ;

        ID NOM                     SALAIRE
---------- -------------------- ----------
         1 Jaouad                      100
         2 orafrance                   200
         3 léoanderson                 300
         4 bouyao                      400
         5 Nuke_y                      500
         6 sheikyerbouti               600
         7 pomalaix                    700
         8 titides                     800
         9 aline                       900
        10 denisys                    1000
        11 niourk                     1100

V-F. Comment charger des données avec des colonnes vides

Utiliser le paramètre :TRAILING NULLCOLS dans le fichier de contrôle.

V-G. Comment Valider uniquement à la fin du chargement

En utilisant le paramètre Rows, attention au UNDO.

V-H. Commet sauvegarder le schéma qui a chargé les données,et le SESSIONID.

En le spécifiant dans le fichier de contrôle :

 
Sélectionnez
LOAD DATA INFILE 'data.csv'
INTO TABLE DVP3_LOADER 
FIELDS TERMINATED BY ';'
 (id  "USER",
 NOM ,          
 SALAIRE        
)

On peut également stocker la date et l'heure d'insertion en spécifiant : « SYSDATE » en lieu et place de « USER »

On peut également spécifier le SESSIONID qui a chargé les données, en le spécifiant dans le fichier de contrôle.

 
Sélectionnez
LOAD DATA INFILE 'data.csv'
INTO TABLE DVP3_LOADER 
FIELDS TERMINATED BY ';'
 (id  "USERENV('SESSIONID')",
 NOM ,          
 SALAIRE        
)

Rappelons que ce numéro est indexé sur une séquence appartenant à SYS :sys.AUDSES$, dont le max value est 2000000000 ( 8174 , 10.1 et 9.2 ).

V-I. Comment modifier les données insérées

Le formatage de données doit se faire dans le fichier de contrôle. Ici nous allons insérer le nom en majuscule et ajouter 1000 € à chacun. Fichier de contrôle :

 
Sélectionnez
LOAD DATA 
INFILE 'data.csv'
TRUNCATE
INTO TABLE DVP_LOADER 
FIELDS TERMINATED BY ';'
(  NOM "upper(:NOM)",
SALAIRE   ":SALAIRE+1000"   )

Le résultat :

 
Sélectionnez
SQL> r
  1*   select * from dvp_loader

NOM                     SALAIRE
-------------------- ----------
JAOUAD                     1100
ORAFRANCE                  1200
LÉOANDERSON                1300
BOUYAO                     1400
NUKE_Y                     1500
SHEIKYERBOUTI              1600
POMALAIX                   1700
TITIDES                    1800
ALINE                      1900
DENISYS                    2000
NIOURK                     2100

11 ligne(s) sélectionnée(s).

Extrait du fichier LOG :

 
Sélectionnez
Table DVP_LOADER, chargé à partir de chaque enregistrement physique.
Option d'insertion en vigueur pour cette table : TRUNCATE

   Nom de colonne               Position   Long.  Séparat. Encadrem. Type de données
------------------------------ ---------- ----- ---- ---- ---------------------
NOM                                 FIRST     *   ;       CHARACTER            
    chaîne SQL pour la colonne : "upper(:NOM)"
SALAIRE                              NEXT     *   ;       CHARACTER            
    chaîne SQL pour la colonne : ":SALAIRE+1000"

V-J. Charger des données en fonction de taille

Nous voulons charger dans la table que les 5 premières lettres
Ficher de contrôle :

 
Sélectionnez
LOAD DATA 
INFILE 'data.csv'
TRUNCATE
INTO TABLE DVP_LOADER 
(  NOM  position (1:5)    )

Résultat :

 
Sélectionnez
  1*   select * from dvp_loader

NOM                     SALAIRE
-------------------- ----------
Jaoua
orafr
léoan
bouya
Nuke_
sheik
pomal
titid
aline
denis
niour

11 ligne(s) sélectionnée(s).)

V-K. Les Index sont mis à jour lors du chargement

Oui les index et clés primaires sont maintenus. Il est possible de désactiver cette option notamment pour des contraintes d'optimisation en indiquant le paramètre = skip_index_maintenance = FALSE

V-L. Comment charger différents fichiers dans la même table

Il faut le spécifier dans le contrôle file ;

 
Sélectionnez
LOAD DATA 
INFILE 'data.csv'
INFILE 'data2.csv'  -- deuxième fichier 
TRUNCATE
INTO TABLE DVP_LOADER 
FIELDS TERMINATED BY ';'
(  NOM , 
salaire    )

Le résultat :

 
Sélectionnez
SQL> r
  1*   select * from dvp_loader

NOM                     SALAIRE
-------------------- ----------
Jaouad                      100
orafrance                   200
léoanderson                 300
bouyao                      400
Nuke_y                      500
sheikyerbouti               600
pomalaix                    700
titides                     800
aline                       900
denisys                    1000
niourk                     1100

NOM                     SALAIRE
-------------------- ----------
Jaouad                      100

12 ligne(s) sélectionnée(s).

V-M. Comment charger des données dans des colonnes « LONG string »

Les champs dont la longueur dépasse 255 caractères doivent être spécifier dans le fichier de contrôle. Par exemple un champ de type varchar2(2000) ou char(1000) doivent être déclarés dans le CTL ainsi.

 
Sélectionnez
LOAD DATA INFILE 'data.csv'
TRUNCATE
INTO TABLE DVP_LOADER 
when (1:6) <> 'Jaouad' 
FIELDS TERMINATED BY ';'
(  NOM CHAR(2000)       
 )

Notons que le déclaration du champ se fait toujours en CHAR(x) que la colonne soit effectivement du char ou même varchar2

V-N. Comment créer une table externe avec le fichier de contrôle.

Il est possible de se servir du fichier de contrôle de Sql*Loader afin de pouvoir créer une table externe. Voici la démarche :

 
Sélectionnez
SQL> r
SQL> create directory loader as 'c:\load' ;

Répertoire créé.
SQL> grant read, write on directory loader to DVP; 

Autorisation de privilèges (GRANT) acceptée.

conn dvp/dvp

SQL> CREATE TABLE dvp_ext 
  2  (
  3   nom varchar2(10),
  4   salaire number 
  5  )
  6   ORGANIZATION EXTERNAL
  7   (
  8     TYPE ORACLE_LOADER
  9     DEFAULT DIRECTORY loader
 10     ACCESS PARAMETERS
 11     (FIELDS TERMINATED BY ';'
 12  (  NOM ,          
 13   SALAIRE        
 14  )
 15     ) 
 16     LOCATION ('data.csv')
 17   )
 18   PARALLEL
 19   REJECT LIMIT UNLIMITED ;

Table créée.

SQL> select * from dvp_ext ;

NOM           SALAIRE
---------- ----------
Jaouad            100
orafrance         200
bouyao            400
Nuke_y            500
pomalaix          700
titides           800
aline             900
denisys          1000
niourk           1100

9 ligne(s) sélectionnée(s).

SQL> 

Pour en savoir plus sur les tables externes

V-O. Comment charger des images avec Sql*Loader.

Il est possible d'effectuer des insertions de Blob via Sql*Loader en paramétrant correctement le fichier de contrôle :

 
Sélectionnez
LOAD DATA INFILE 'image.dat'
INTO TABLE DVP_LOADER 
FIELDS TERMINATED BY ';'
( external_filename  FILLER CHAR(50),
"BLOBDATA"  LOBFILE(external_filename) TERMINATED BY EOF      
 )

V-P. Comment paralléliser les chargements.

Ici nous allons essayer de paralléliser les chargements, combinant cette option avec le chemin direct nous espérons avoir des temps de traitements réduits.

 
Sélectionnez
C:\load>sqlldr userid=formation/formation control=control.txt log=log.txt bad=bad.txt discard=disard.txt direct=y errors=0 parallel=TRUE

Extrait du fichier Log :

 
Sélectionnez
SQL
 Chemin utilisé:      Direct - avec option parallèle.

Table DVP_LOADER, chargé à partir de chaque enregistrement physique.
Option d'insertion en vigueur pour cette table : APPEND

L'option Parallelel n'est disponible qu'avec la clause APPEND, sinon une erreur SQL*Loader-279: risque de subvenir.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2005 Jaouad. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.