更新XMLType向节点添加新属性

时间:2017-10-30 14:43:31

标签: xml oracle10g oracle-sqldeveloper oracle12c

我们陷入了从Oracle 10迁移到Oracle 12c的过程中。 我们迁移了部分数据库,其中大部分数据都包含XmlType文档。由于新要求,某些文档需要更新属性。

最初,我们有以下xml:

index:   0 1 2 3 4 5
result:  0 1 2 0 1 2
item:    1 2 3 1 2 3

在xmlupdate之后,它需要是这样的:

<root>
 <a id="1">
  aaaaaaaaaa
 </a>
 <b id="2">
  bbbbbbbbbb
 </b>
</root>

在Oracle 10中,这将成功:

<root>
 <a id="1">
  aaaaaaaaaa
 </a>
 <b id="2" newAttribute="">
  bbbbbbbbbb
 </b>
</root>

这应该是可行的,但是在Oracle 12中它不起作用(select语句在update TABLE_NAME set whattoUpdate = (select insertchildxml(whattoUpdate, 'xpathexpression', '@attribute', 'valueOfAttribute', 'namespace') as result from TABLE_NAME where id = XX); 中返回空白xml)。

根据this,不再支持函数SqlDeveloper

1 个答案:

答案 0 :(得分:1)

create table example( xml clob);

insert into example values( '<root>
 <a id="1">
  aaaaaaaaaa
 </a>
 <b id="2">
  bbbbbbbbbb
 </b>
</root>');

update example set xml = xmlserialize( document XMLQuery('
xquery version "1.0";
copy $cp := .
modify
    insert node attribute  newAttribute {""} into $cp/root/a
return $cp
'
passing xmltype(xml) returning content) indent size = 2);

xmlserialize(document {xmltype} indent size =2 ) - 正在将xml更改为clob xmluqery结构是 xmlquery( 'xquery language' passing {xmltype} returning content)

copy $cp :=.创建输入xml文档的副本。是必需的,因为无法修改原始数据。

modify insert node attribute newAttribute {""} into $cp/root/a return $cp - xquery命令。在所选元素中添加新属性。