今天接到个需求,要将一个文本文件的内容给加载到某个表的clob字段中,之前对lob了解很少,不过在tom的expert-one-on-one中介绍了可以通过如下存储过程来实现这个功能。
declare
a_clob clob;
a_warn integer;
bfile_name bfile :=bfilename('FILE_DUMP','3.txt');
begin
insert into clobtest values (empty_clob())
returning col1 into a_clob;
dbms_lob.fileopen(bfile_name);
dbms_lob.loadfromfile(a_clob, bfile_name,dbms_lob.getlength(bfile_name));
dbms_lob.fileclose(bfile_name);
commit;
end;
/
a_clob clob;
a_warn integer;
bfile_name bfile :=bfilename('FILE_DUMP','3.txt');
begin
insert into clobtest values (empty_clob())
returning col1 into a_clob;
dbms_lob.fileopen(bfile_name);
dbms_lob.loadfromfile(a_clob, bfile_name,dbms_lob.getlength(bfile_name));
dbms_lob.fileclose(bfile_name);
commit;
end;
/
使用该过程后,查询数据发现有乱码,出现乱码的根本原因是dbms_lob包里的loadfromfile过程不支持变长的字符集,比如GBK,UTF8等。解决方法的可以使用dbms_lob包里的另外一个过程loadclobfromfile过程,因为此过程中有个参数叫BFILE_CSID,这个参数可以用来指定bfile文件使用的字符集编码。使用方法如下:
declare
v_clob clob;
bfil bfile :=bfilename('FILE_DUMP','3.txt');
dest_offset number :=1;
source_offset number :=1;
src_csid number :=NLS_CHARSET_ID('UTF8');
lang_ctx integer :=DBMS_LOB.DEFAULT_LANG_CTX;
warn integer;
begin
insert into clobtest values (empty_clob())
returning col1 into v_clob;
dbms_lob.fileopen(bfil);
DBMS_LOB.LOADCLOBFROMFILE(v_clob,bfil,DBMS_LOB.LOBMAXSIZE,dest_offset,source_offset,src_csid,lang_ctx,warn);
dbms_lob.fileclose(bfil);
commit;
end;
/
v_clob clob;
bfil bfile :=bfilename('FILE_DUMP','3.txt');
dest_offset number :=1;
source_offset number :=1;
src_csid number :=NLS_CHARSET_ID('UTF8');
lang_ctx integer :=DBMS_LOB.DEFAULT_LANG_CTX;
warn integer;
begin
insert into clobtest values (empty_clob())
returning col1 into v_clob;
dbms_lob.fileopen(bfil);
DBMS_LOB.LOADCLOBFROMFILE(v_clob,bfil,DBMS_LOB.LOBMAXSIZE,dest_offset,source_offset,src_csid,lang_ctx,warn);
dbms_lob.fileclose(bfil);
commit;
end;
/
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20801486/viewspace-745243/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/20801486/viewspace-745243/