ちょっとテスト用にデータを詰めたのでメモ。忘れる自信があるので。
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; /