编写一个查询来解析 XML clob,需要返回一个特定的子节点,其中节点 = 375。有问题的 XML:
表是F1_MKTMSG_IN_DATA 列是 MKTMSG_ID,其中包含以下 XML(示例记录)
<root>
<MKT_MSG_DATA>
<receivedDetail>
<rpdtGrp>
<rpdt>
<rpdt>375</rpdt>
<rpd>2023-11-05</rpd>
</rpdt>
<rpdt>
<rpdt>656</rpdt>
<rpd>2023-11-05</rpd>
</rpdt>
<rpdt>
<rpdt>MRR</rpdt>
<rpd>2023-11-05</rpd>
</rpdt>
</rpdtGrp>
<rpdrGrp/>
<rpaGrp/>
<mdlGrp/>
<udlGrp/>
<cdGrp/>
</receivedDetail>
</MKT_MSG_DATA>
</root>
我需要选择
我尝试过使用
select EXTRACTVALUE(XMLTYPE('<root>' || MKT_MSG_DATA || '</root>'), 'root/MKT_MSG_DATA/receivedDetail/rpdtGrp[1]/rpdt[1]/rpd[1]') FROM F1_MKTMSG_IN_DATA
这将为我提供正确的值,但前提是 xml 按特定顺序排列,我无法确定它是否总是按该顺序排列,所以我需要它来实际找到特定值。另外我听说 extractvalue 早已被弃用,所以我更喜欢使用其他东西
您可以更改 XPath 以过滤子节点值:
'root/MKT_MSG_DATA/receivedDetail/rpdtGrp/rpdt[rpdt="375"]/rpd'
我不确定你为什么要添加
root
节点;您的示例值已经具有它,但想必您的真实代码没有 - 但由于 MKT_MSG_DATA
本身就是一个有效的片段,因此添加 root
似乎并没有真正实现任何目标。
另请注意,
EXTRACTVALUE
已被弃用很长一段时间,您可以使用XMLQuery
代替:
select xmlquery('/MKT_MSG_DATA/receivedDetail/rpdtGrp/rpdt[rpdt="375"]/rpd/text()'
passing XMLType(MKT_MSG_DATA)
returning content).getStringVal() as result
from F1_MKTMSG_IN_DATA
如果需要,您可以将返回的值转换为本机日期。