2017-06-01 57 views
0

我在具有XMLTYPE类型的DUMMY表中将列的值设为VALUE。 它包含:在Oracle SQL中用NULL值替换具体的XML标记

<?xml version="1.0"?> 
    <ROWSET> 
    <Value> 
    <Data>802 
    </Data> 
    </Value> 
    <Value> 
    <Data>902 
     </Data> 
    </Value> 
    </ROWSET> 

我需要用空值代替802值标记。 输出应为:

<?xml version="1.0"?> 
    <ROWSET> 
    <Value> 
    <Data>902 
    </Data> 
    </Value> 
    </ROWSET> 

802值标记应该用NULL去除。

我试过如updateXML():

update Dummy set VALUE=updatexml(VALUE,'ROWSET/Value/Data/text()',''); 

但将只更新802空值。

第二种方法: 更新虚拟集Value = updatexml(Value,'ROWSET','');

但它会删除ROWSET tag.Then里面的一切,它仅包含:

<?xml version="1.0"?> 
<ROWSET/> 

我试图替换()了。

 update Dummy set emps=replace(' 
     <Value><Data>802 
     </Data></Value>',null); 

然后,它会从VALUE列中删除其他值,并且只保留replace()中提到的标记。

在此之后替换(),它包含:

<Value><Data>802 
    </Data></Value> 

请建议我在此。

回答

1

你需要

  • 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; 

... ...产量

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>                   

注:xmlserialize()功能在这里仅用于美化印花。

现在您的更新

update Dummy X 
set X.value = deletexml(X.value, '/ROWSET/Value[normalize-space(Data)="802"]'); 

注甲骨文12C:应该有使用XQuery一个更优雅的解决方案,但我无法得到XQuery语言十足的把握还,因此我仅向您展示deleteXml()解决方案。

+0

谢谢。它帮助了很多。 – 5extremers