ねら~ITエンジニア雑記

やきうのお兄ちゃんが綴るOracle Databaseメインのブログ

BLOB を CLOB に変換する(DBMS_LOB.CONVERTTOCLOB)

BLOB型のデータをCLOB型に変換するには DBMS_LOBパッケージのCONVERTTOCLOBプロシージャを使用する。

Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス
11g リリース2(11.2)
B56262-03
79 DBMS_LOB
CONVERTTOCLOBプロシージャ
http://docs.oracle.com/cd/E16338_01/appdev.112/b56262/d_lob.htm#i1020356

下記は BLOB_Aテーブルの C1カラム(BLOB型) を DBMS_LOB.CONVERTTOCLOBプロシージャで CLOB に変換するサンプルコード。

SET LINESIZE 32767;
SET PAGESIZE 50000;
SET LONG 1000000;
SET LONGC 1000000;
VARIABLE cclob CLOB;
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;
  i_warning      INTEGER;
  i_lob_length   INTEGER;
  cblob          BLOB;
BEGIN
    -- Loading to clob from blob
  SELECT C1 INTO cblob FROM BLOB_A WHERE ROWNUM <= 1;
  DBMS_LOB.CREATETEMPORARY(:cclob, TRUE, DBMS_LOB.CALL);
  DBMS_LOB.CONVERTTOCLOB(
    :cclob,
    cblob,
    i_amount,
    i_dest_offset,
    i_src_offset,
    i_default_csid,
    i_lang_context,
    i_warning
  );
END;
/
PRINT cclob;

実行結果は以下の通り。判り難いけど上手くいってるyo!

SQL> SELECT DBMS_LOB.GETLENGTH(C1) FROM BLOB_A;

DBMS_LOB.GETLENGTH(C1)
----------------------
                780988

SQL> DESC BLOB_A;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 C1                                                 BLOB

SQL> SELECT DBMS_LOB.GETLENGTH(C1) FROM BLOB_A;

DBMS_LOB.GETLENGTH(C1)
----------------------
                780988

SQL> SET ECHO ON
SQL> @./cclob.sql
SQL> SET SERVEROUTPUT ON SIZE UNLIMITED;
SQL> SET LINESIZE 32767;
SQL> SET PAGESIZE 50000;
SQL> SET LONG 1000000;
SQL> SET LONGC 1000000;
SQL> VARIABLE cclob CLOB;
SQL> DECLARE
  2    i_amount       INTEGER := DBMS_LOB.LOBMAXSIZE;
  3    i_dest_offset  INTEGER := 1;
  4    i_src_offset   INTEGER := 1;
  5    i_default_csid INTEGER := DBMS_LOB.DEFAULT_CSID;
  6    i_lang_context INTEGER := DBMS_LOB.DEFAULT_LANG_CTX;
  7    i_warning      INTEGER;
  8    i_lob_length   INTEGER;
  9    cblob          BLOB;
 10  BEGIN
 11      -- Loading to clob from blob
 12    SELECT C1 INTO cblob FROM BLOB_A WHERE ROWNUM <= 1;
 13    DBMS_LOB.CREATETEMPORARY(:cclob, TRUE, DBMS_LOB.CALL);
 14    DBMS_LOB.CONVERTTOCLOB(
 15      :cclob,
 16      cblob,
 17      i_amount,
 18      i_dest_offset,
 19      i_src_offset,
 20      i_default_csid,
 21      i_lang_context,
 22      i_warning
 23    );
 24  END;
 25  /

PL/SQL procedure successfully completed.

SQL> PRINT cclob;

CCLOB
---------------------------------------------------------------------
  CREATE MATERIALIZED VIEW "TESTA"."MVIEW_A" (…