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