如何从物理文件更新oracle sql developer中的CLOB列

时间:2015-07-07 05:07:56

标签: oracle

我在表中有一个CLOB列,其中包含大量的Xml数据。我需要为一行表更新此列的值。我怎么能这样做?

我尝试过谷歌搜索,但这种简单明了的东西在任何地方都没有简单的语言。有人可以建议吗?

如果我使用普通的更新查询语法并将大量xml内容粘贴到单引号内(xml内容中的单引号替换为2个单引号),则sql开发人员只会禁用执行查询按钮。

update tableName t 
set t.clobField = 'How to specify physical file data'
where t.anotherField='value'; 

2 个答案:

答案 0 :(得分:1)

您需要创建一个函数,该函数将从文件中读取数据到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.

答案 1 :(得分:0)

在互联网上搜索"从文件中加载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;
/