Pour commencer, vous devez comprendre ce que sont les LOB. Ce sont des "données volumineuses", peut-être plus volumineuses que tout autre type de données dans Oracle. Ils sont comme des fichiers normaux sur un système de fichiers. Pour écrire dans un fichier sur un système de fichiers, vous devrez
- ouvrir le fichier en écriture
- tronquez le fichier si vous souhaitez recommencer à le remplir
- lire vos données source par tranches en boucle
- ajoutez vos blocs de données au fichier dans la même boucle, un par un
- fermer le fichier
Plus ou moins la même chose est vraie pour les LOB. Dans votre table, une colonne LOB (CLOB/BLOB/NCLOB) n'est qu'un pointeur/référence vers un autre endroit de votre stockage sur disque contenant les données réelles. Dans les termes standard d'Oracle, le pointeur est appelé "Localisateur LOB". Vous devez
- ouvrir/initialiser le localisateur LOB
- tronquer le contenu LOB, si vous souhaitez commencer à le remplir à partir de zéro
- ajoutez vos blocs de données au contenu LOB dans une boucle, un par un
- fermer le localisateur LOB
En PL/SQL, cela pourrait ressembler à ceci :
-- create table blob_test(id number, b blob);
declare
v_b blob;
aaa raw(32767);
longLine varchar2(32767);
begin
longLine := LPAD('aaaa', 32767,'x');
aaa := UTL_RAW.CAST_TO_RAW(longLine);
insert into blob_test values(1,empty_blob()) returning b into v_b;
dbms_lob.open(v_b,dbms_lob.lob_readwrite);
dbms_lob.writeappend(v_b,UTL_RAW.LENGTH (aaa) ,aaa);
dbms_lob.close(LOB_LOC=>v_b);
commit;
end;
Une explication :
- initialiser le localisateur LOB =
insert into blob_test values(1,empty_blob()) returning b into v_b;
- ouvrir le localisateur LOB pour l'écriture =
dbms_lob.open(v_b,dbms_lob.lob_readwrite);
- tronquez le contenu du LOB, si vous souhaitez commencer à le remplir à partir de zéro... Ceci est fait par le
empty_blob()
appeler dans leinsert
. - ajoutez vos blocs de données au contenu LOB dans une boucle, un par un =ici une seule itération de
dbms_lob.writeappend()
, en ajoutant un seul blocaaa
de longueurutl_raw.length(aaa)
(maximum de 32767) dans le LOBv_b
- fermer le localisateur LOB =
dbms_lob.close(LOB_LOC=>v_b);