簡體   English   中英

如何從物理文件更新 CLOB 列?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM