1

我在 XMLTYPE 类型的 DUMMY 表中有列作为 VALUE。它包含:

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

对于 802 值标签,我需要将其替换为 NULL。输出应该是:

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

802 值标签应使用 NULL 删除。

我试过UpdateXML():

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

但它只会用 null 更新 802 值。

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

但它会删除 ROWSET 标记内的所有内容。然后,它将仅包含:

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

我也试过 Replace() 。

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

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

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

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

请就此向我提出建议。

4

1 回答 1

2

你需要

  • 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"]');

Oracle 12c 的注意事项:使用 XQuery 应该有一个更优雅的解决方案,但我还不能完全掌握 XQuery 语言,因此我deleteXml()只向您介绍解决方案。

于 2017-06-01T08:56:59.707 回答