在Oracle中更新CLOB字段

时间:2012-11-26 16:26:11

标签: oracle clob

我在Oracle数据库中有一个表,其中包含数据类型为CLOB的字段。字段名称为XMLString。我正在存储每个记录长度为10,000个字符的XML字符串。我在这张表中有超过10万条记录。

我需要更新特定位置的每条记录上的XML字符串段。例如,我需要使用“我的新文本”等字符串更新第14个位置的每个记录。此替换文本长度为11个字符。所以这只是意味着它将从第14个角色开始取代11个追逐者。

我尝试使用DBMS_LOB.FRAGMENT_REPLACE,但这并不是我想要的。

是否有像

这样的简单命令
Replace(XMLString, 14, ‘My New text’) 

这样我可以做下面的事情吗?

UPDATE MYTABLE 
SET MyClobField = Replace(MyClobField, 14, 'My New text')
WHERE MyTableID>5000

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:5)

使用

的SQL
UPDATE MYTABLE 
SET MyClobField = substr(MyClobField, 1, 10) || to_clob('MyNewtext')||substr(MyClobField, 10+length('MyNewtext')+1)
where..

只需将“10”的两次出现更改为偏移量。

或在PL / SQL中使用DBMS_LOB.WRITE API(这比上面更快)

SQL> create table foo(c clob);

Table created.

SQL> insert into foo values ( 'this is a test string ' || rpad('x', 20, 'x'));

1 row created.

SQL> commit;

Commit complete.

SQL> select * from foo;

C
--------------------------------------------------------------------------------
this is a test string xxxxxxxxxxxxxxxxxxxx

SQL> declare
  2    v_lob clob;
  3  begin
  4
  5    for r_lob in (select c
  6                    from foo
  7                    for update)
  8    loop
  9      dbms_lob.write(r_lob.c, 6, 16, 'phrase'); -- ie write at offset 16, 6 bytes
 10    end loop;
 11  end;
 12  /

PL/SQL procedure successfully completed.

SQL> select * from foo;

C
--------------------------------------------------------------------------------
this is a test phrase xxxxxxxxxxxxxxxxxxxx

答案 1 :(得分:0)

尝试一下:-

更新表设置列= replace(column,'hello','abcded')