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;