文字列をBLOBに変換及びzipで圧縮してテーブルに格納する方法です。
また、テーブルに格納されているBLOBデータ(zipファイル)を取り出し、ディレクトリオブジェクトを使用してファイル出力する方法も記載します。
文字列をBLOBに変換及びzipで圧縮
文字列「あいうえお」をBLOBに変換及び圧縮して、TB_SAMPLEテーブルのBLOBカラムに登録するサンプルです。
DECLARE
wk_original VARCHAR2(32767) := 'あいうえお';
i_blob BLOB;
o_blob BLOB;
BEGIN
-- 一時BLOBの初期化
DBMS_LOB.CREATETEMPORARY(i_blob, TRUE, DBMS_LOB.CALL);
DBMS_LOB.OPEN(i_blob, DBMS_LOB.LOB_READWRITE);
-- 文字列をBLOBに変換して、BLOB変数に格納する
DBMS_LOB.WRITEAPPEND(
i_blob
,LENGTHB(wk_original)
,UTL_RAW.CAST_TO_RAW(wk_original)
);
-- BLOBデータの圧縮(gz形式)
-- 第1引数:圧縮したいBLOBデータ
-- 第2引数:圧縮精度 1~9(デフォルトは6)
-- 1が圧縮速度が速いが圧縮密度は低い
-- 9が圧縮速度が遅く圧縮密度は高い
o_blob := UTL_COMPRESS.LZ_COMPRESS(i_blob, 6);
-- 圧縮したBLOBデータをテーブルに登録
INSERT INTO TB_SAMPLE (ID, BLOB_DATA) VALUES (1, o_blob);
COMMIT;
-- 解放処理
DBMS_LOB.CLOSE(i_blob);
DBMS_LOB.FREETEMPORARY(i_blob);
END;
/
PL/SQLプロシージャが正常に完了しました。
BLOBデータ(zipファイル)をファイル出力
TB_SAMPLEテーブルからBLOBデータを取り出し、ディレクトリオブジェクトを使用してファイル出力しています。これでテーブルに格納されいてるzipファイルを出力することができます。
DECLARE
wk_file_handle UTL_FILE.FILE_TYPE;
wk_file_size INTEGER;
wk_start_size INTEGER := 1;
wk_write_size INTEGER := 2000;
wk_raw LONG RAW;
wk_blob BLOB;
BEGIN
-- zipで圧縮されているBLOBデータをテーブルから取得
SELECT
BLOB_DATA
INTO
wk_blob
FROM
TB_SAMPLE
WHERE
ID = 1
;
-- 出力ファイル「sample.gzip」を"wb"モードでオープンする
-- 「SAMPLE_DIR」はディレクトリオブジェクト
wk_file_handle := UTL_FILE.FOPEN('SAMPLE_DIR', 'sample.zip', 'wb');
-- BLOBデータのサイズを取得する
wk_file_size := DBMS_LOB.GETLENGTH(wk_blob);
-- 2000バイトずつ出力する
WHILE wk_start_size < wk_write_size LOOP
-- 最後の書込みの場合、サイズを調整する
IF wk_start_size + wk_write_size > wk_file_size THEN
wk_write_size := wk_file_size - wk_start_size + 1;
END IF;
-- BLOBデータを先頭から読み込んで「wk_raw」に格納
DBMS_LOB.READ(wk_blob, wk_write_size, wk_start_size, wk_raw);
-- 「wk_raw」に代入されたBLOBデータをファイル出力する
UTL_FILE.PUT_RAW(wk_file_handle, wk_raw, true);
-- 書込み開始位置を加算する
wk_start_size := wk_start_size + wk_write_size;
END LOOP;
-- 解放処理
UTL_FILE.FCLOSE(wk_file_handle);
END;
/
PL/SQLプロシージャが正常に完了しました。