Utiliser sqlplus pour entrer les commandes suivantes.
1) Création du directory image_dir
-- connecté en sysdba
create directory image_dir as '/home/oracle/';
grant read, write on directory image_dir to dba_spir;
2) Création de la table test
-- Connecté en dba Oracle (par exemple)
--
-- Suppression de la table test (si elle existe)
drop table test;
--
-- Création de la table test contenant un blob
CREATE TABLE test(id number, image blob);
--
-- Alimentation de la table test avec trois images
-- Attention, dans le répertoire pointé par le directory, doit exister les fichiers .png listé ci-dessous
INSERT INTO test VALUES(1,bfilename('IMAGE_DIR','020234.png'));
INSERT INTO test VALUES(2,bfilename('IMAGE_DIR','110453.png'));
INSERT INTO test VALUES(3,bfilename('IMAGE_DIR','180232.png'));
--
-- Validation des inserts
commit;
--
-- Vérification du contenu de la table
select * from test;
--
-- Création d'un Type correspondant a un tableau de Blob
PROMPT Suppression TYPE Typ_Tab_Blob FORCE;
DROP TYPE Typ_Tab_Blob FORCE;
PROMPT create TYPE Typ_Tab_Blob as table of Typ_Obj_Prenom
CREATE OR REPLACE TYPE Typ_Tab_Blob as table of Blob;
/
-- Attention ne pas oublié de copier le /
3) Création de la procédure d’extraction du blob dans un fichier
CREATE OR REPLACE PROCEDURE extract_Blob_2_File ( P_Blob_Data IN BLOB
, P_NomFichier IN VARCHAR2
, P_directory IN VARCHAR2 default 'IMAGE_DIR'
)
IS
W_Fichier UTL_FILE.FILE_TYPE;
W_Buffer RAW(32767);
W_Quantite BINARY_INTEGER := 32767;
W_Decalage INTEGER := 1;
BEGIN
W_Fichier := UTL_FILE.FOPEN(P_directory, P_NomFichier, 'WB'); -- Replace with your directory
-- Loop through the BLOB data and write to the file
LOOP
DBMS_LOB.READ (P_Blob_Data, W_Quantite, W_Decalage, W_Buffer);
UTL_FILE.PUT_RAW (W_Fichier, W_Buffer, TRUE);
W_Decalage := W_Decalage + W_Quantite;
EXIT WHEN W_Quantite < 32767;
END LOOP;
UTL_FILE.FCLOSE(W_Fichier);
DBMS_OUTPUT.PUT_LINE('BLOB extracted to file ' || P_NomFichier || ' successfully.');
EXCEPTION
WHEN OTHERS THEN
IF UTL_FILE.IS_OPEN(W_Fichier) THEN
UTL_FILE.FCLOSE (W_Fichier);
END IF;
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END extract_Blob_2_File;
/
4) Exécution de la procédure par Block PL/SQL
set serveroutput on
DECLARE
W_BaseLine VARCHAR2(100) := 'output_file';
W_Extension VARCHAR2(10) := '.png';
W_NomFichier VARCHAR2(100);
W_Blob_Data BLOB;
W_Cmd_Sql VARCHAR2(1000);
BEGIN
For rec In (select id from test)
Loop
-- Construction du nom du fichier
W_NomFichier := W_BaseLine || rec.id || W_Extension;
W_Cmd_Sql := 'SELECT IMAGE FROM test WHERE id = :1 ';
EXECUTE IMMEDIATE W_Cmd_Sql INTO W_Blob_Data USING rec.id ;
extract_Blob_2_File (P_Blob_Data => W_Blob_Data, P_NomFichier => W_NomFichier);
End Loop;
END;
/
5) Creation d’une précédure d’appel
CREATE OR REPLACE PROCEDURE Appel_extract_Blob_2_File
IS
W_BaseLine VARCHAR2(100) := 'output_file';
W_Extension VARCHAR2(10) := '.png';
W_NomFichier VARCHAR2(100);
W_Blob_Data BLOB;
W_Cmd_Sql VARCHAR2(1000);
BEGIN
FOR rec In (select id from test)
LOOP
-- Construction du nom du fichier
W_NomFichier := W_BaseLine || rec.id || W_Extension;
W_Cmd_Sql := 'SELECT IMAGE FROM test WHERE id = :1 ';
EXECUTE IMMEDIATE W_Cmd_Sql INTO W_Blob_Data USING rec.id ;
extract_Blob_2_File (P_Blob_Data => W_Blob_Data, P_NomFichier => W_NomFichier);
END LOOP;
END;
/
6) exécution de la procédure d’appel
exec Appel_extract_Blob_2_File;