TB_SAMPLEテーブルのBLOBカラムに格納されているバイナリデータを文字列に変換して出力するPL/SQLサンプルです。
文字列で出力する関係上、CLOBに変換してからDBMS_OUTPUT.PUT_LINEを使って出力しています。
BLOBカラムには3行分の文字列データが格納されていて、BLOBのデータ部分だけを出力するために、PL/SQLはSQLファイルで用意し、スクリプト実行をしています。
BLOBカラムのデータをSPOOLで出力
PL/SQLのSQLファイルを用意
下記のPL/SQLコードが記載された「sample.sql」を用意する。
SET LINESIZE 32767 SET PAGESIZE 0 SET HEADING OFF SET TRIMSPOOL ON SET FEEDBACK OFF SET ECHO OFF SET RECSEP OFF SET LONG 1000000 SET LONGC 1000000 SET SERVEROUTPUT ON SPOOL sample.csv DECLARE i_amount INTEGER := DBMS_LOB.LOBMAXSIZE; i_dest_offset INTEGER := 1; i_src_offset INTEGER := 1; i_default_csid INTEGER := DBMS_LOB.DEFAULT_CSID; i_lang_context INTEGER := DBMS_LOB.DEFAULT_LANG_CTX; o_warning INTEGER; i_blob BLOB; o_clob CLOB; BEGIN SELECT BLOB_DATA INTO i_blob FROM TB_SAMPLE WHERE ID = 1 ; DBMS_LOB.CREATETEMPORARY(o_clob, TRUE, DBMS_LOB.CALL); DBMS_LOB.CONVERTTOCLOB( o_clob, -- 変換先(CLOB) i_blob, -- 変換元(BLOB) i_amount, -- 変換する文字数 i_dest_offset, -- 変換先(CLOB)への書き込み開始位置 i_src_offset, -- 変換元(BLOB)への変換開始位置 i_default_csid, -- 変換元(BLOB)の文字セットID i_lang_context, -- とりあえずデフォルト値を渡す o_warning -- 警告あれば返却されるらしい ); -- 各行にCRLFの改行コードが付いているデータを出力するが、 -- SPOOLすると不要な空行が自動で付くのを回避するためにCRを削除している -- 他に良い方法があるかもしれない DBMS_OUTPUT.PUT_LINE(REPLACE(o_clob, CHR(13), NULL)); END; / SPOOL OFF
sample.sqlを実行
SQL> @sample.sql BLOBカラムのデータ(1行目) BLOBカラムのデータ(2行目) BLOBカラムのデータ(3行目)
sample.csvの出力結果
BLOBカラムのデータ(1行目) BLOBカラムのデータ(2行目) BLOBカラムのデータ(3行目)