Gestion de bases de données

Comment charger le contenu d'un fichier dans un champ BLOB et décharger le contenu d'un BLOB dans un fichier du système d'exploitation

S'applique à

Oracle Server - Enterprise Edition - Version : 10.2.0.1 à 10.2.0.3
Les informations de ce document s'appliquent à toutes les plateformes.

Objectif

Cette note décrit les étapes pour charger un fichier binaire dans une colonne BLOB d'une table, ainsi que la façon de décharger le contenu d'une colonne BLOB dans un fichier du système de fichiers.

RENAPS offre des services gérés TI. Découvrez comment nous pouvons aider votre entreprise

Solution

Charger le contenu d'un fichier binaire dans une colonne BLOB d'une table

Créez ces 2 tables

SQL> CREATE TABLE MYLOB ( ID NUMBER, PHOTO BLOB ) ; 
SQL> CREATE TABLE TEMP_BFILE( B_FILE BFILE) ; 

Insérez dans temp_file le localisateur bfile du fichier binaire

SQL> insert into temp_bfile values ( bfilename('MYDIR','pic1.jpg')); 

MYDIR est un objet répertoire créé avec la commande CREATE DIRECTORY.

Insertion du lob dans le fichier

SQL> declare 
tmp_blob blob default EMPTY_BLOB(); 
tmp_bfile bfile:=null; 
dest_offset integer:=1; 
src_offset integer:=1; 
begin 
select b_file into tmp_bfile from temp_bfile; 
DBMS_LOB.OPEN (tmp_bfile, DBMS_LOB.FILE_READONLY); 
dbms_lob.createtemporary(tmp_blob, TRUE); 
DBMS_LOB.LOADBLOBFROMFILE(tmp_blob,tmp_bfile,DBMS_LOB.LOBMAXSIZE,dest_offset,src_offset); 
insert into mylob values(1,tmp_blob); 
DBMS_LOB.CLOSE(tmp_bfile); 
commit; 
end; 

Décharger le contenu d'une colonne BLOB d'une table dans un fichier du système de fichiers

Déchargez le blob dans un fichier

SQL> declare 
tmp_blob blob default empty_blob(); 
begin 
dbms_lob.createtemporary(tmp_blob, true); 
select photo into tmp_blob from mylob; 
sys.retrieve_lob_to_file (tmp_blob, 'MYDIR','mypic1.jpg'); 
end; 
/ 

Remarque : MYDIR est un objet répertoire créé avec la commande CREATE DIRECTORY

Source de la procédure retrieve_lob_to_file

CREATE OR REPLACE PROCEDURE retrieve_lob_to_file(temp_blob in BLOB, file_path in varchar2, file_name in varchar2) IS 
data_buffer RAW (32767); 
position INTEGER := 1; 
filehandle utl_file.file_type; 
error_number NUMBER; 
error_message VARCHAR2(100); 
blob_length INTEGER; 
chunk_size BINARY_INTEGER := 32767; 
BEGIN 
blob_length := dbms_lob.getlength(temp_blob); 

filehandle := utl_file.fopen(file_path, file_name,'wb', 1024); 

WHILE position < blob_length LOOP 

dbms_lob.read (temp_blob, chunk_size, position, data_buffer); 

utl_file.put_raw (filehandle, data_buffer); 
position := position + chunk_size; 
data_buffer := null; 
END LOOP; 

utl_file.fclose(filehandle); 


EXCEPTION 
WHEN OTHERS THEN 
BEGIN 
error_number := sqlcode; 
error_message := substr(sqlerrm ,1 ,100); 
dbms_output.put_line('Error #: ' || error_number); 
dbms_output.put_line('Error Message: ' || error_message); 
utl_file.fclose_all; 
END; 
END; 
/ 

Notez que le code PL/SQL des exemples ci-dessus est fourni à des fins d'apprentissage uniquement ; il a toutefois été testé sur une base de données 10.2.0.1, et des tests approfondis sont nécessaires avant de le mettre en œuvre en production.