|
declare
v_clob_data clob;
v_clob_buffer varchar2(32767);
v_file_size integer;
v_file_handle utl_file.file_type;
v_start_point integer := 1;
v_write_size integer := 32767;
begin
-- CLOBデータ列「filedata」のロケータを「v_clob_data」に代入する
select filedata into v_clob_data from clob01 where code = 'C01';
-- 出力ファイル「sample01.txt」を"w"モードでオープンする
v_file_handle := utl_file.fopen('LOB_DIR', 'sample01.txt', 'w');
-- CLOBデータのサイズを取得する
v_file_size := dbms_lob.getlength(v_clob_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;
-- CLOBデータを先頭からCLOBデータサイズ読み込み、「v_clob_buffer」に代入
dbms_lob.read(v_clob_data, v_write_size, v_start_point, v_clob_buffer);
-- 「v_clob_buffer」に代入されたCLOBデータをファイル出力する
utl_file.put(v_file_handle, v_clob_buffer);
-- 書込み開始位置を進める
v_start_point := v_start_point + v_write_size;
end loop;
-- 出力ファイル「sample01.txt」をクローズする。
utl_file.fclose(v_file_handle);
end;
|