用于从CLOB中删除XMLTAG元素的SQL查询

时间:2015-03-03 17:57:14

标签: oracle clob

CREATE TABLE STREAM
  ( PAYLOAD CLOB
  );

    INSERT
    INTO stream VALUES ('<MC><RECORD><CODE>4995908</CODE><TITLE>Adrenocortical </TITLE><ROOT_CODE>380146</ROOT_CODE><MOD>229</MOD></RECORD><RECORD><CODE>69354563</CODE><TITLE> right</TITLE><ROOT_CODE>380146</ROOT_CODE><MOD>230</MOD></RECORD></MC><MT><RECORD><TYPE>LATERALITY</TYPE><TITLES>Laterality</TITLES><MOD><MODIFIER><MCS>69383650</MCS></MODIFIER></MOD></RECORD></MT>')

我想删除XMLELEMENTS(Adrenocortical AND RIGHT&lt; / TITLE&gt;) 从上面的行,也无法转换为XMLTYPE。

1 个答案:

答案 0 :(得分:2)

您可以使用PL / SQL块中的dbms_lob过程执行此操作;但是通过一些工作,您可以使用XML功能。第一步是将CLOB转换为可以转换为XMLType的东西,比如将它包装在虚拟根节点中:

select xmltype('<xml>' || payload || '</xml>') from stream;

然后您可以使用XQuery或deletexml()函数删除所有TITLE个节点:

select deletexml(xmltype('<xml>' || payload || '</xml>'), '//TITLE')
from stream;

然后 - 这是复杂的位 - 通过将MC和MT节点作为单独的CLOB提取并将它们重新组合在一起来删除虚拟根节点:

select concat(x.mc.getclobval(), x.mt.getclobval())
from stream s
cross join xmltable('/xml'
  passing deletexml(xmltype('<xml>' || s.payload || '</xml>'), '//TITLE')
  columns mc xmltype path 'MC',
    mt xmltype path 'MT') x;

或者要更新原始值,请将其用作子查询:

update stream
set payload = (
  select concat(x.mc.getclobval(), x.mt.getclobval())
  from stream s
  cross join xmltable('/xml'
    passing deletexml(xmltype('<xml>' || s.payload || '</xml>'), '//TITLE')
    columns mc xmltype path 'MC',
      mt xmltype path 'MT') x
);

由于你只显示了一列和一行,我还没有完成任何关联;如果您有多行,则需要关联某些ID值,并且可能只更新包含标题的行。

这会给你:

select payload from stream;

PAYLOAD                                                                                                                                                                                                                                                                                                     
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
<MC><RECORD><CODE>4995908</CODE><ROOT_CODE>380146</ROOT_CODE><MOD>229</MOD></RECORD><RECORD><CODE>69354563</CODE><ROOT_CODE>380146</ROOT_CODE><MOD>230</MOD></RECORD></MC><MT><RECORD><TYPE>LATERALITY</TYPE><TITLES>Laterality</TITLES><MOD><MODIFIER><MCS>69383650</MCS></MODIFIER></MOD></RECORD></MT>