テーブルに登録されている圧縮済みの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プロシージャが正常に完了しました。