5

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

我需要在特定位置更新每条记录上的 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

任何帮助,将不胜感激。

4

3 回答 3

8

SQL 使用

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

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

或者在这样的 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
于 2012-11-26T16:35:41.010 回答
0

试试这个 :-

更新表集列=替换(列,'你好','abcded')

于 2019-08-08T09:19:19.123 回答
-1

试试这个 :-

DECLARE
      str varchar2(32767);
    BEGIN
      str := '<big-string>';
      update <table-name> set <col-name-1>= str where <col-name-2>= ;
    END;
于 2021-12-22T18:31:54.710 回答