[英]How to update CLOB column from a physical file?
我在一个包含大量 XML 数据的表中有一个CLOB
列。 我需要为表格的一行更新此列的值。 我怎样才能做到这一点?
我试过谷歌搜索,但这种明显简单的东西在任何地方都没有简单的语言。 有人可以建议吗?
如果我使用正常的更新查询语法并将巨大的 xml 内容粘贴到单引号内(xml 内容中的单引号替换为 2 个单引号),那么 sql 开发人员只是禁用了执行查询按钮。
update tableName t
set t.clobField = 'How to specify physical file data'
where t.anotherField='value';
您需要创建一个函数,该函数将文件中的数据读取到 CLOB 数据类型的变量中,并将其作为结果返回。
试试这个工作示例:
create table tclob (id number, filename varchar2 (64), doc clob)
/
insert into tclob values (1, 'test.xml', empty_clob ());
commit;
create or replace function clobLoader (filename varchar2) return clob is
bf bfile := bfilename ('TEMPFILES', filename);
cl clob;
begin
if dbms_lob.fileexists (bf) = 1 then
dbms_lob.createtemporary (cl, true);
dbms_lob.fileopen (bf, dbms_lob.file_readonly);
dbms_lob.loadfromfile (cl, bf, dbms_lob.getlength (bf));
dbms_lob.fileclose (bf);
else cl := empty_clob ();
end if;
return cl;
end;
/
用法:
update tclob t
set t.doc = clobLoader (t.filename)
where t.id = 1;
1 row updated.
在 Internet 上搜索“从文件加载 clob”,您会找到几个示例。 比如这个( http://www.anujparashar.com/blog/loading-text-file-into-clob-field-in-oracle ):
DECLARE
v_bfile BFILE;
v_clob CLOB;
BEGIN
v_bfile := BFILENAME (p_file_directory, p_file_name);
IF DBMS_LOB.FILEEXISTS (v_bfile) = 1 THEN
DBMS_LOB.OPEN (v_bfile);
DBMS_LOB.CREATETEMPORARY (v_clob, TRUE, DBMS_LOB.SESSION);
DBMS_LOB.LOADFROMFILE (v_clob, v_bfile, DBMS_LOB.GETLENGTH (v_bfile));
DBMS_LOB.CLOSE (v_bfile);
INSERT INTO tbl_clob (clob_col)
VALUES (v_clob);
END IF;
COMMIT;
END;
/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.