|
declare
v_blob_data blob;
v_blob_buffer long raw;
v_file_size integer;
v_file_handle utl_file.file_type;
v_start_point integer := 1;
v_write_size integer := 2000;
begin
-- BLOBデータ列「filedata」のロケータを「v_blob_data」に代入する
select filedata into v_blob_data from blob01 where code = '001';
-- 出力ファイル「sample02.gif」を"wb"モードでオープンする
v_file_handle := utl_file.fopen('LOB_DIR', 'sample02.gif', 'wb');
-- BLOBデータのサイズを取得する
v_file_size := dbms_lob.getlength(v_blob_data);
while v_start_point < v_file_size loop
-- 最後の書込みの場合、書込みサイズを残りサイズに合わせる
if v_start_point + v_write_size > v_file_size then
v_write_size := v_file_size - v_start_point +1;
end if;
-- BLOBデータを先頭からBLOBデータサイズ読み込み、「v_blob_buffer」に代入
dbms_lob.read(v_blob_data, v_write_size, v_start_point, v_blob_buffer);
-- 「v_blob_buffer」に代入されたBLOBデータをファイル出力する
utl_file.put_raw(v_file_handle, v_blob_buffer, true);
-- 書込み開始位置を進める
v_start_point := v_start_point + v_write_size;
end loop;
-- 出力ファイル「sample02.gif」をクローズする。
utl_file.fclose(v_file_handle);
end;
|