1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
PROCEDURE write_blob(p_id NUMBER, p_name VARCHAR2) IS
v_file utl_file.file_type;
v_repertoire VARCHAR2(512) := 'c:\temp\';
v_fichier VARCHAR2(256) := p_name;
v_buffer RAW(32000);
v_offset PLS_INTEGER DEFAULT 1;
v_taille PLS_INTEGER;
v_longueur PLS_INTEGER;
v_chunk PLS_INTEGER;
v_blob BLOB;
BEGIN
-- On récupére le BLOB
SELECT image INTO v_blob FROM t_blob WHERE id = 1;
-- On l'ouvre en lecture afin de pouvoir le parser plus facilement
dbms_lob.OPEN(v_blob, dbms_lob.lob_readonly);
-- On regarde la taille de Chunk idéale
v_chunk := dbms_lob.getchunksize(v_blob);
-- On regarde sa longueur
v_longueur := dbms_lob.getlength(v_blob);
-- On crée le fichier sur le disque dur
v_file := utl_file.fopen(v_repertoire, v_fichier, 'w', 32767);
-- On ecrit dans le fichier tant que l'on a pas fait tout le BLOB
WHILE v_offset < v_longueur LOOP
IF v_longueur - (v_offset - 1) > v_chunk THEN
v_taille := v_chunk;
ELSE
v_taille := v_longueur - (v_offset - 1);
END IF;
v_buffer := NULL;
-- On lit la partie du BLOB qui nous interesse
dbms_lob.READ(v_blob, v_taille, v_offset, v_buffer);
-- On ecrit cette partie dans le fichier
utl_file.put(file => v_file, buffer => utl_raw.cast_to_varchar2(v_buffer));
utl_file.fflush(file => v_file);
v_offset := v_offset + v_taille;
END LOOP;
-- On ferme le BLOB
dbms_lob.CLOSE(v_blob);
-- On ferme le fichier
utl_file.fclose(v_file);EXCEPTION
WHEN OTHERS THEN
IF dbms_lob.ISOPEN(v_blob) = 1 THEN
dbms_lob.CLOSE(v_blob);
END IF;
IF utl_file.is_open(file => v_file) THEN
utl_file.fclose(file => v_file);
END IF;
END; |
Partager