Oracle-XMLTYPE:如何更新值

Posted

技术标签:

【中文标题】Oracle-XMLTYPE:如何更新值【英文标题】:Oracle-XMLTYPE : How to update a value 【发布时间】:2016-09-08 10:36:13 【问题描述】:

我有一个带有 xmltype 列的 Oracle 表,它以以下格式存储 XML

<?xml version="1.0" encoding="WINDOWS-1252"?>
<View>
    <ReportValues>
        <SalaryValue variable="HR" value="999"/>
        <SalaryValue variable="floor" value="20"/>
    </ReportValues>
</View>

我想知道如何将变量“HR”的值从 999 更新为 666,以及如何将变量值从“floor”更新为“SALES”

【问题讨论】:

【参考方案1】:

虽然@Анатолий Предеин 的答案对于 10g 和 11g 绝对正确,但需要注意的是 updatexml 一直是 deprecated in Oracle 12c。

从 12cR1 开始,推荐的操作 XML 的方法是 XQuery Update Facility。它不是专门针对 Oracle 的,但 W3C 建议也实现了许多其他 XML 工具。

您将在下面找到一个完整的示例。但是,我没有详细介绍 XQuery,而是将您指向以下文档:

XQuery Update for the impatient Replacing XML Nodes 来自 Oracle XML DB 开发人员指南

示例设置

create table so61_t(
 id number
,xml xmltype
);

insert into so61_t values(1, '<?xml version="1.0" encoding="WINDOWS-1252"?>
<View>
    <ReportValues>
        <SalaryValue variable="HR" value="999"/>
        <SalaryValue variable="floor" value="20"/>
    </ReportValues>
</View>');

insert into so61_t values(2, '<?xml version="1.0" encoding="WINDOWS-1252"?>
<View>
    <ReportValues>
        <SalaryValue variable="HR" value="998"/>
        <SalaryValue variable="floor" value="19"/>
    </ReportValues>
</View>');

修改 XML

update so61_t set xml =
xmlquery(
'copy $t := $x modify(
  (for $i in $t/View/ReportValues/SalaryValue[@variable="HR"]/@value
   return replace value of node $i with ''666'')
 ,(for $i in $t/View/ReportValues/SalaryValue[@variable="floor"]/@value
   return replace value of node $i with ''SALES'')
) return $t'
passing xml as "x" returning content
)
where id = 1
;

结果

SQL> col id for 99
SQL> col xml for a78
SQL> select id, xmlserialize(content xml as varchar2(200)) as xml from so61_t;
 ID XML
--- -------------------------------------------------
  1 <?xml version="1.0" encoding="UTF-8"?>
    <View>
      <ReportValues>
        <SalaryValue variable="HR" value="666"/>
        <SalaryValue variable="floor" value="SALES"/>
      </ReportValues>
    </View>
  2 <?xml version="1.0" encoding="UTF-8"?>
    <View>
      <ReportValues>
        <SalaryValue variable="HR" value="998"/>
        <SalaryValue variable="floor" value="19"/>
      </ReportValues>
    </View>

SQL>

【讨论】:

谢谢大家。我使用了上面提供的解决方案之一。【参考方案2】:

检查 UPDATEXML orace 函数 (https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions205.htm)

with xml as ( select '<?xml version="1.0" encoding="WINDOWS-1252"?>
<View>
    <ReportValues>
        <SalaryValue variable="HR" value="999"/>
        <SalaryValue variable="floor" value="20"/>
    </ReportValues>
</View>' xml from dual) 

select updatexml( xmltype.createxml(xml.xml),'/View/ReportValues/SalaryValue[@variable="HR"]/@value','666'  )
  from xml

返回这个:

<?xml version="1.0" encoding="WINDOWS-1252"?>
  <View>
    <ReportValues>
      <SalaryValue variable="HR" value="666"/>
      <SalaryValue variable="floor" value="20"/>
    </ReportValues>
  </View>

对于“地板”变量,它可能如下所示:

select updatexml( x,'/View/ReportValues/SalaryValue[@variable="floor"]/@variable','SALES'  ) 
  from (
select updatexml( xmltype.createxml(xml.xml),'/View/ReportValues/SalaryValue[@variable="HR"]/@value','666'  ) x
  from xml )

【讨论】:

以上是关于Oracle-XMLTYPE:如何更新值的主要内容,如果未能解决你的问题,请参考以下文章

从 DropdownItems 中选择值后,DropdownButton 值未更新。如何使用 selectedValue 更新默认值?

mysql如何根据一列值更新另一列的值?

如何使用 pymongo 更新值?

如果值为空,如何在单个查询中更新列的值,然后使用前一个非空值进行更新[重复]

如何更新解析的 xml 值

Mysql如果某个字段值存在则更新另一个字段的值为原值+100,命令应该如何写?