Sql*Loader : Comment effectuer des chargements de données sous OracleDate de publication : 14 Septembre 2005
Charger des données provenant d'un fichier I. Préface II. Introduction III. SQL*LOADER III-A. Comment appeler sqlldr ? III-B. Comment marche sqlldr III-B-1. Le fichier de contrôle III-B-2. Le fichier de données III-B-3. Le fichier : Bad Files III-B-4. Le fichier : Discard Files III-B-5. Le fichier Log : Log files III-C. Les paramètres de Sql*Loader III-C-1. Le paramètre Direct IV. Exemple IV-A. Préparation IV-B. Création de la table IV-C. Création du fichier de données IV-D. Création du fichier de contrôle IV-E. Création de la commande de chargement IV-F. Résultat V. Sql*Loader FAQ V-A. Comment éviter de charger la première ligne V-B. Comment filtrer les chargements V-C. Comment exporter des données d'Oracle V-D. Comment charger les mêmes données dans plusieurs tables V-E. Comment charger des données et les valeurs d'une séquence V-F. Comment charger des données avec des colonnes vides V-G. Comment Valider uniquement à la fin du chargement V-H. Commet sauvegarder le schéma qui a chargé les données, ainsi que le SESSIONID V-I. Comment modifier les données insérées V-J. Charger des données en fonction de taille V-K. Les Index sont mis à jour lors du chargement V-L. Comment charger différents fichiers dans la même table V-M. Comment charger des données dans des colonnes " LONG string " V-N. Comment créer une table externe avec le fichier de contrôle. V-O. Comment charger des images avec Sql*Loader. V-P. Comment paralléliser les chargements. 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 )
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 :
III. SQL*LOADERIII-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.
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).
![]() 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 :
III-B-2. Le fichier de données
C'est un fichier plat ( csv, txt ... ) qui stocke les données et les séparateurs.
III-B-3. Le fichier : Bad Files
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
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-B-5. Le fichier Log : Log files
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 :
III-C. 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.
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.
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-C-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.
Attention, 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 :
Ces fonctionnalités ne sont utilisables avec l'option DIRECT PATH :
IV. Exemple
Nous allons illustrer notre documentation par un petit exemple concret .
IV-A. PréparationIV-B. Création de la table
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.
IV-D. Création du fichier de contrôle
Nous allons insérer les données dans la table créée en mode direct :
IV-E. Création de la commande de chargement
Nous avons paramétrer 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 :
Cette table n'est pas vide. Comme nous utilisons l'option TRUNCATE, la taille de la table devrait diminuer ( et de fait son HWM).
Voyons ce que donne le HWM :
Fichier LOG :
Table DVP_LOADER :
V. Sql*Loader FAQBienvenue 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 :
Ici nous désirons ne pas insérer la première ligne qui correspond aux colonnes. Commande :
Le paramètre SKIP=1 permet d'ignorer la première ligne. D'ailleurs nous retrouvons cette d'information dans le fichier LOG:
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:
Le fichier Log :
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 :
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 :
Lancer la commande. Le résultat :
V-E. Comment charger des données et les valeurs d'une séquence
Préparer l'environnement :
Modifier le fichier de contrôle.
Voilà le résultat.
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 :
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 charger les données, en le spécifiant dans le fichier de contrôle.
Rappellons que ce numéro est indéxé 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 :
Le résultat :
Extrait du fichier LOG :
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 :
Résultat :
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 ;
Le résultat :
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.
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 :
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 :
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.
Extrait du fichier Log :
|
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 oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Jaouad ZOUAGHI. 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.