5

Oracle データベースに、データ型のフィールドを持つテーブルがありますCLOB。フィールドの名前は ですXMLString。各レコードに 10,000 文字の長さの XML 文字列を保存しています。このテーブルには 100,000 を超えるレコードがあります。

特定の場所で各レコードの XML 文字列のセグメントを更新する必要があります。たとえば、「My New text」のような文字列を使用して、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つのオカレンスをオフセットに変更するだけです。

または、DBMS_LOB.WRITEAPIを使用したこのようなPL/ SQL(これは上記よりも高速です)

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

これを試して :-

update table set column = replace(column,'hello','abcded')

于 2019-08-08T09:19:19.123 に答える