在Oracle 19c中使用XMLTABLE获取子节点的父节点名称
解决方案:获取XML节点的父节点名称(Oracle 19c)
示例XML结构
假设你的XML_TEST表中XML_DATA字段的示例XML如下:
<ROOT> <AR_ITEMS> <EVENTS> <ID>1</ID> <NAME>Event A</NAME> </EVENTS> <EVENTS> <ID>2</ID> <NAME>Event B</NAME> </EVENTS> </AR_ITEMS> <AP_ITEMS> <EVENTS> <ID>3</ID> <NAME>Event C</NAME> </EVENTS> </AP_ITEMS> </ROOT>
原问题查询(返回错误节点名)
你当前的查询可能类似这样,返回的ITEMTYPE是EVENTS本身:
SELECT x.itemtype, x.id, x.name FROM xml_test t, XMLTABLE('/ROOT/*/EVENTS' PASSING t.xml_data COLUMNS itemtype VARCHAR2(20) PATH 'name()', id NUMBER PATH 'ID', name VARCHAR2(50) PATH 'NAME') x;
修正后的查询(获取父节点名称)
通过在PATH中使用../name(),可以直接获取当前EVENTS节点的父节点名称,无需转换XMLTYPE到其他类型:
SELECT x.itemtype, x.id, x.name FROM xml_test t, XMLTABLE('/ROOT/*/EVENTS' PASSING t.xml_data COLUMNS itemtype VARCHAR2(20) PATH '../name()', id NUMBER PATH 'ID', name VARCHAR2(50) PATH 'NAME') x;
原理说明
../表示在当前节点(EVENTS)的上下文里向上定位到父节点(即AR_ITEMS、AP_ITEMS这类节点)name()函数用于获取该父节点的节点名称- 整个操作完全基于
XMLTYPE原生处理,符合Oracle 19c的要求,不需要转换为CLOB或其他类型
查询结果示例
| ITEMTYPE | ID | NAME |
|---|---|---|
| AR_ITEMS | 1 | Event A |
| AR_ITEMS | 2 | Event B |
| AP_ITEMS | 3 | Event C |
内容的提问来源于stack exchange,提问作者to-find
相关产品推荐
相关产品推荐

