2017-06-01 12 views
0

XMLTYPEタイプのDUMMY表にVALUEとして列があります。 それは含まれています特定のXMLタグをOracle SQLのNULL値に置き換えます。

<?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で除去されるべきです。

I)は、(UPDATEXMLを試してみました:

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

しかし、それがnullでのみ802値を更新します。

第2のアプローチ: 更新ダミーセット値= updatexml(値、 '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を必要とします。

のは

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; 

最初に私たちのXPathをテストしましょう...利回り...

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()機能のみをかなり印刷のためにここで使用されます。 Oracleの12cのための今すぐ

あなたの更新

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

注:は、XQueryを使用してこれをよりエレガントな解決策をがあるはずですが、私はまだXQuery言語の完全な理解を得ることができませんでしたしたがって、deleteXml()ソリューションのみをご紹介します。

+0

ありがとうございました。それは多くの助けとなりました。 – 5extremers

関連する問題