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