m@rc-lenzin

Wenn etwas schief geht, dann freu dich. Das sind die Geschichten die dir in Erinnerung bleiben werden

oracle – BLOB Image exportieren

Bilder aus BLOB-Spalten zu exportieren ist nicht ganz einfach mit den normalen DBA-Tools. Daher habe ich folgende Procedure und Directory Skrikte erstellt.

Zuerst benötige ich ein Directory welches auf dem DB-Server erstellt wird:

CREATE OR REPLACE DIRECTORY 
EXP_IMAGES AS 
'/u09/exp_image';

GRANT EXECUTE, READ, WRITE ON DIRECTORY EXP_IMAGES TO [USERNAME] WITH GRANT OPTION;

Danach kann die Procedure erstellt werden. Diese muss natürlich auf die Tabelle angepasst werden in welcher die Bilder gespeichert sind
(create table tbl_01 (image_id number(11),bildname varchar2(200),image blob)):

CREATE OR REPLACE procedure blob2file (p_id in number)
is
  t_blob        blob;
  vstart        number := 1;
  bytelen       number := 32000;
  t_blob_len    number;
  my_vr         raw(32000);
  x             number;
  t_file_name   varchar2(200);
  l_output      utl_file.file_type;
begin
--
  for i in (
      select bildname                           file_name,
             dbms_lob.getlength(image)       blob_len,
             image                              blob_val
      from   tbl_01 
      where  bildname is not null
      and    image_id = p_id
  ) loop
--
  begin
      x := i.blob_len;
      l_output := utl_file.fopen('EXP_IMAGES', i.file_name, 'WB', 32760);
        DBMS_OUTPUT.PUT_LINE('Write File '||i.file_name);
      if i.blob_len < 32760 then
        utl_file.put_raw(l_output,i.blob_val);
        utl_file.fflush(l_output);
      else
        vstart := 1;
        while vstart < i.blob_len
        loop
          dbms_lob.read(i.blob_val,bytelen,vstart,my_vr);
          utl_file.put_raw(l_output,my_vr);
          utl_file.fflush(l_output);
          vstart := vstart + bytelen;
          x := x - bytelen;
          if x < 32000 then
            bytelen := x;
          end if;
        end loop;
      end if;
      utl_file.fclose(l_output);
  end;
  end loop;
end blob2file;
/

Der Export ist nun ganz einfach, für das Bild mit der ID Nr. 1:

exec blob2file(1);

Weiter Beitrag

Zurück Beitrag

© 2025 m@rc-lenzin

Thema von Anders Norén