SQL

BLOBデータの圧縮とファイル出力

  • このエントリーをはてなブックマークに追加

文字列を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プロシージャが正常に完了しました。

  • このエントリーをはてなブックマークに追加

コメントを残す

*