Bonjour,
J'ai stocké une image dans ma base, et je voudrais régénérer un fichier à partir de mon BLOB. J'ai fais une procedure en m'inspirant du code sur ce site La procedure s'execute sans bug mais le problème c'est que le fichier qui est généré est corompu. Apparemment, il a la même taille que le fichier d'origine mais je peux pas l'ouvrir pour le visualiser.
Je vous met ma procédure ci dessous. Voilà, si quelqu'un peut m'aider, ça serait bien sympa.
Merci.
PS : Je travail avec Oracle Express 10G. Sais pas si ça peut servir.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 create or replace PROCEDURE write_blob IS v_file utl_file.file_type; v_repertoire VARCHAR2(512) := 'TEMP'; v_fichier VARCHAR2(256) := 'heaven2C.JPG'; 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 SELECT image INTO v_blob FROM MES_PHOTOS WHERE id = 1; dbms_lob.OPEN(v_blob, dbms_lob.lob_readonly); v_chunk := dbms_lob.getchunksize(v_blob); v_longueur := dbms_lob.getlength(v_blob); dbms_output.put_line (v_longueur); DBMS_OUTPUT.ENABLE(100000); v_file := utl_file.fopen(v_repertoire, v_fichier, 'w', 32767); WHILE v_offset < v_longueur LOOP dbms_output.put_line ('///////////'); 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; dbms_lob.READ(v_blob, v_taille, v_offset, v_buffer); 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; dbms_lob.CLOSE(v_blob); 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