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。
答案 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>