Gblog

おもにTips

CLOB にデータを詰める

ちょっとテスト用にデータを詰めたのでメモ。忘れる自信があるので。

drop user g cascade;
grant dba to g identified by g;
conn g/g
create table test1 (id number, c1 clob) lob (c1) store as securefile(disable storage in row) ;

declare
    buffer      varchar2(32767);
    clobdata    clob;
begin
    insert into test1 values( 1, empty_clob()) returning c1 into clobdata;
    buffer := rpad('x',10000,'x');
    dbms_lob.write( clobdata, dbms_lob.getlength( buffer ), 1, buffer);

    commit;
end;
/

 

PL/SQL だと 32767byte 以上は扱えないので、、、リテラルで埋めるなら loop するしかないのか?

declare
    buffer      varchar2(32767);
    offset      number;
    clobdata    clob;

begin
    insert into test1 values( 2, empty_clob()) returning c1 into clobdata;
    buffer := rpad('x',10000,'x');
    for i in 1..100 loop
        offset := 1 + (i-1) * 10000 ;
        dbms_lob.write( clobdata, dbms_lob.getlength(buffer), offset, buffer);
    end loop;
    commit;
end;
/

 

ちゃんとデータが入っている。

SQL> select dbms_lob.getlength(c1) from test1;

DBMS_LOB.GETLENGTH(C1)
----------------------
                 10000
               1000000

 

 

参考までに、ファイルを読み込ませる場合のケース

create or replace directory TMP as '/tmp';

declare
    tmpfile     bfile := bfilename( 'TMP', 'a.txt');
    clobdata    clob;
begin
    insert into test1 values( 1, empty_clob()) returning c1 into clobdata;
    dbms_lob.fileopen( tmpfile , dbms_lob.file_readonly);
    dbms_lob.loadfromfile( clobdata, tmpfile, dbms_lob.getlength( tmpfile ));
    dbms_lob.fileclose( tmpfile );
    commit;
end;
/