Replace 在Oracle SQL中将特定XML标记替换为空值
我将列作为XMLTYPE类型的伪表中的值。 它包括:Replace 在Oracle SQL中将特定XML标记替换为空值,replace,plsql,updatexml,Replace,Plsql,Updatexml,我将列作为XMLTYPE类型的伪表中的值。 它包括: <?xml version="1.0"?> <ROWSET> <Value> <Data>802 </Data> </Value> <Value> <Data>902 </Data> </Value> </ROWSET> 但它只会用null更
<?xml version="1.0"?>
<ROWSET>
<Value>
<Data>802
</Data>
</Value>
<Value>
<Data>902
</Data>
</Value>
</ROWSET>
但它只会用null更新802值
第二种方法:
更新虚拟集值=updatexml(值,'ROWSET',''
但它将删除行集标记内的所有内容。然后,它将仅包含:
<?xml version="1.0"?>
<ROWSET/>
我也试过了
更新虚拟集emps=replace('
802
,空);
然后它将从VALUE列中删除其他值,并仅保留replace()中提到的标记
在这个replace()之后,它包含:
<Value><Data>802
</Data></Value>
802
请就此向我提出建议。您需要什么
而不是deleteXml()
,以及updateXml()
- 要删除的内容的正确XPath
with input$ as (
select --+ no_merge
xmltype(q'{<?xml version="1.0"?>
<ROWSET>
<Value>
<Data>802
</Data>
</Value>
<Value>
<Data>902
</Data>
</Value>
</ROWSET>}') as xx
from dual
)
select
xmlserialize(document X.xx indent) as original,
xmlserialize(document
deletexml(X.xx, '/ROWSET/Value[normalize-space(Data)="802"]')
indent
) as with_802_removed
from input$ X;
Oracle 12c注意:使用XQuery应该有一个更优雅的解决方案,但我还不能完全掌握XQuery语言,因此我只向您介绍
deleteXml()
解决方案。谢谢。这很有帮助。
update Dummy set emps=replace('
<Value><Data>802
</Data></Value>',null);
<Value><Data>802
</Data></Value>
with input$ as (
select --+ no_merge
xmltype(q'{<?xml version="1.0"?>
<ROWSET>
<Value>
<Data>802
</Data>
</Value>
<Value>
<Data>902
</Data>
</Value>
</ROWSET>}') as xx
from dual
)
select
xmlserialize(document X.xx indent) as original,
xmlserialize(document
deletexml(X.xx, '/ROWSET/Value[normalize-space(Data)="802"]')
indent
) as with_802_removed
from input$ X;
ORIGINAL WITH_802_REMOVED
---------------------- ----------------------
<?xml version="1.0"?> <?xml version="1.0"?>
<ROWSET> <ROWSET>
<Value> <Value>
<Data>802 <Data>902
</Data> </Data>
</Value> </Value>
<Value> </ROWSET>
<Data>902
</Data>
</Value>
</ROWSET>
update Dummy X
set X.value = deletexml(X.value, '/ROWSET/Value[normalize-space(Data)="802"]');