テーブルに登録されている圧縮済みのBLOBデータをファイルに出力するサンプルPL/SQLになります。
前提条件
TB_SAMPLEテーブルにファイル名とファイルの中身(BLOB)データが3件格納されています。
DESC TB_SAMPLE; 名前 型 ----------- ------------- FILE_NAME VARCHAR2(12) BLOB_DATA BLOB SELECT FILE_NAME, BLOB_DATA FROM TB_SAMPLE; FILE_NAME BLOB_DATA ----------- -------------------------- SAMPLE01.csv (BLOB) SAMPLE02.csv (BLOB) SAMPLE03.csv (BLOB)
BLOBデータの解凍及びファイル出力
DECLARE
wk_file_handle UTL_FILE.FILE_TYPE;
wk_blob BLOB;
wk_blob_length NUMBER;
wk_amount BINARY_INTEGER := 20000;
wk_offset INTEGER := 1;
wk_buffer RAW(32766);
-- ファイル名とBLOBデータを抽出
CURSOR curBlob IS
SELECT
FILE_NAME
, BLOB_DATA
FROM
TB_SAMPLE
;
recBlob curBlob%ROWTYPE;
BEGIN
OPEN curBlob;
LOOP
FETCH curBlob INTO recBlob;
EXIT WHEN curBlob%NOTFOUND;
-- 圧縮されているBLOBデータを解凍する
wk_blob := recBlob.BLOB_DATA;
wk_blob := UTL_COMPRESS.LZ_UNCOMPRESS(wk_blob);
-- 「SAMPLE_DIR」はディレクトリオブジェクト
-- recBlob.FILE_NAMEを実際のファイル名にする
wk_file_handle := UTL_FILE.FOPEN('SAMPLE_DIR', recBlob.FILE_NAME, 'wb');
-- BLOB_DATAの長さを取得
wk_blob_length := DBMS_LOB.GETLENGTH(wk_blob);
-- 20000バイトずつファイル出力
wk_offset := 1;
wk_buffer := NULL;
FOR i IN 1..CEIL(wk_blob_length/wk_amount) LOOP
DBMS_LOB.READ(
wk_blob
, wk_amount
, wk_offset
, wk_buffer
);
UTL_FILE.PUT_RAW(wk_file_handle, wk_buffer, true);
wk_offset := wk_offset + wk_amount;
END LOOP;
-- 解放処理
UTL_FILE.FCLOSE(wk_file_handle);
END LOOP;
CLOSE curBlob;
END;
/
PL/SQLプロシージャが正常に完了しました。