Replace 在Oracle SQL中将特定XML标记替换为空值

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更

我将列作为XMLTYPE类型的伪表中的值。 它包括:

  <?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
让我们先测试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"]');