Bonjour,

J'ai stocké une image dans la base, après je veux régénérer un fichier à partir d'un BLOB .

Voici la procédure que j'ai utilisée
j'ai tout exécuter mais je ne trouve rien sur le disque?

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
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;