「xml->text->xml」チェーンは複雑な場合がありますが、場合によっては役立つことがあります(たとえば、挿入がオプションではなく更新のみの場合)。varchar列の「n」個のピース(宛先テーブルまたは別のテーブル、リモートDBの別のスキーマでパーヒープ)を試すことができます。ここで、「n」は次のとおり
です。ceil(max(dbms_lob.getlength(MyXmlColumn))/ 4000)
次に、これらのフラグメントをリモートの一時フィールドに転送できます。
insert into RemoteSchema.MyTable(Id, XmlPart1, XmlPart2,...)
(select 1 /*some Id*/,
dbma_lob.substr(MyXmlColumn.getclobval(), 4000, 1),
dbma_lob.substr(MyXmlColumn.getclobval(), 4000, 4001),
...
from LocalSchema.MyTable
XmlTypeは、次のようなフラグメントから再構成できます。
create or replace function concat_to_xml(p_id number)
return xmltype
is
xml_lob clob;
xml xmltype;
begin
dbms_lob.createtemporary(xml_lob, true);
for r in (select XmlPart1, XmlPart2, ... from RemoteSchema.MyTable where Id = p_id)
loop
if r.XmlPart1 is not null then
dbms_lob.writeappend(xml_lob, length(r.XmlPart1), r.XmlPart1);
end if;
if r.XmlPart2 is not null then
dbms_lob.writeappend(xml_lob, length(r.XmlPart2), r.XmlPart2);
end if;
...
end loop;
xml := xmltype(xml_lob);
dbms_lob.freetemporary(xml_lob);
return xml;
end;
最後に、結果を使用して、次のようなremotheスキーマ内の他のテーブルを更新します。
update RemoteSchema.MyTable2 t2 set t2.MyXmlColumn = concat_to_xml(1 /*some Id*/);