SQL

BLOBデータの解凍とファイル出力

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

テーブルに登録されている圧縮済みの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プロシージャが正常に完了しました。
  • このエントリーをはてなブックマークに追加

コメントを残す

*