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 更新默认值?