ねら~ITエンジニア雑記

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

DBMS_LOB.LoadClobFromFileプロシージャを使ってテキストファイルを Oracle Database の CLOB型列 に ロードする。

表題の通り、DBMS_LOB.LOADCLOBFROMFILEプロシージャ で
テキストファイル を CLOB型列 に ロードするやで彡(゚)(゚)

まずCLOB型の列を持つテーブルとディレクトリ・オブジェクトを作ります。

CONNECT AYSHIBAT/xxxxxxxx
CREATE TABLE TEST_CLOB (
    C1 NUMBER
  , C2 CLOB
);
ALTER TABLE TEST_CLOB ADD CONSTRAINT TEST_CLOB_PK PRIMARY KEY(C1) USING INDEX;

CONNECT /AS SYSDBA
CREATE DIRECTORY DIR_AYSHIBAT as '/home/oracle/work/ayshibat';
GRANT READ, WRITE ON DIRECTORY DIR_AYSHIBAT TO AYSHIBAT;

テキストファイルをディレクトリ・オブジェクトのパスに置きます。

$ pwd
/home/oracle/work/ayshibat
$ ls -la
total 112
drwxr-xr-x 2 oracle oinstall   4096 Aug 15 11:49 .
drwxr-xr-x 3 oracle oinstall   4096 Aug 15 11:45 ..
-rw-r--r-- 1 oracle oinstall 102000 Aug 15 11:47 test_clob_data.txt
$

件数が無いのを確認して、DBMS_LOB.LOADCLOBFROMFILEプロシージャでテキストファイルをCLOB型列に流し込むと……

SELECT C1, DBMS_LOB.GETLENGTH(C2) FROM TEST_CLOB;

no rows selected

DECLARE
  bfile_p  BFILE;       -- BFILE pointer
  clob_loc CLOB;        -- CLOB locator
  n_c1     NUMBER;      -- TEST_CLOB Column C1
  n_doffs  NUMBER := 1; -- dest_offset
  n_soffs  NUMBER := 1; -- src_offset
  n_lctx   NUMBER := 0; -- lang_context
  n_warn   NUMBER;      -- warning
BEGIN
  -- BFILE pointer set
  bfile_p := BFILENAME('DIR_AYSHIBAT', 'test_clob_data.txt');
  -- Insert record and CLOB locator get
  SELECT NVL(MAX(C1), 0) + 1 INTO n_c1 FROM TEST_CLOB;
  INSERT INTO TEST_CLOB VALUES (n_c1, EMPTY_CLOB())
  RETURNING C2 INTO clob_loc;
  -- File open
  DBMS_LOB.FILEOPEN(bfile_p, DBMS_LOB.FILE_READONLY);
  -- LOAD CLOB from text file
  DBMS_LOB.LOADCLOBFROMFILE(
      clob_loc                   -- CLOB locator
    , bfile_p                    -- BFILE pointer
    , DBMS_LOB.LOBMAXSIZE        -- amount
    , n_doffs                    -- dest_offset
    , n_soffs                    -- src_offset
    , NLS_CHARSET_ID('AL32UTF8') -- BFILE Characterset ID
    , n_lctx                     -- lang_context
    , n_warn                     -- warning
  );
  COMMIT;
  -- File close
  DBMS_LOB.FILECLOSE(bfile_p);
END;
/

PL/SQL procedure successfully completed.

件数とバイト数を確認すると、上手く行ったやで彡(^)(^)

SELECT C1, DBMS_LOB.GETLENGTH(C2) FROM TEST_CLOB;

        C1 DBMS_LOB.GETLENGTH(C2)
---------- ----------------------
         1                 102000

マニュアル類(※11gR2版)は下記やで彡(゚)(゚)

DBMS_LOBパッケージ
LOADCLOBFROMFILEプロシージャ
http://docs.oracle.com/cd/E16338_01/appdev.112/b56262/d_lob.htm#i998978

SQL言語リファレンス
BFILENAME
http://docs.oracle.com/cd/E16338_01/server.112/b56299/functions019.htm#i76871

SQL言語リファレンス
EMPTY_BLOB、EMPTY_CLOB
http://docs.oracle.com/cd/E16338_01/server.112/b56299/functions056.htm#i77384

SQL言語リファレンス
NLS_CHARSET_ID
http://docs.oracle.com/cd/E16338_01/server.112/b56299/functions108.htm#i78230

Qiita にも書いたやで!彡(^)(^)

http://qiita.com/ora_gonsuke777/items/f4d06f1ba5122fcd5f22