Insérer un CLOB par sql*Loader

Oracle intègre un type de données CLOB particulièrement adapter au stockage de longs textes (le type LONG est à proscrire depuis la 9i).


Cependant lorsqu'un client désire insérer une ligne contenant un CLOB, certaines limites peuvent être problématiques :
- un varchar2 ne peut dépasser 4000 caractères ; il est donc impossible de faire cette insertion via un ordre SQL qui effectue une conversion implicite.
- en PL, une variable de type varchar2 ne pourra dépasser 32000 caractères. La solution de découper la chaîne en bloc de 4000 pour la stocker dans une variable ne pourra dépasser cette limite.
- le package PL est alors une solution techniquement parfaite. Cependant, son utilisation n'est pas des plus aisée.
En effet, les types CLOB et BLOB se manipulent avec des outils particuliers, présents dans le package DBMS_LOB.
- SQL*Loader permet de s'affranchir de ces barrières mais oblige d'avoir le client Oracle (sqlldr n'est pas une commande reconnue en JDBC)

C'est la mise en oeuvre de cette dernière solution sur laquelle on se penche dans cet article. pour insérer des tuples contenant des CLOB (la manip est identique pour des BLOB).

Le texte à importer est le contenu du fichier nommé JV_2LSLM.txt pour l'ID 23 :

SQL> create table livre (id number, titre varchar2(500), contenu CLOB);

Table created.



~$ cat imp_livre.ctl
load data
infile imp_livre.dat
into table livre
fields terminated by '|'
(
id char(20),
titre char(500),
mon_lob filler char(500),
contenu LOBFILE(mon_lob) terminated by EOF
)


~$ cat imp_livre.dat
23|20000 lieues sous les mers|JV_2LSLM.txt


~$ sqlldr USEREX/PASSEX control=imp_livre.ctl



SQL> col titre format A35
SQL> col contenu format A25
SQL> select * from livre;

ID TITRE CONTENU
---------- ----------------------------------- -------------------------
23 20000 lieues sous les mers
blablabla
blablabla
blablabla
blablabla
blablabla
blablabla
blablabla
blablabla




Nous constatons ici que, par défaut sqlplus n'affiche qu'une partie du texte stocké dans le CLOB (il passe par DBMS_LOB.SUBSTR de manière implicite).




Vous n'avez pas trouver réponse à votre question ? Préciser votre recherche :

Catégories