You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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或其他类型

查询结果示例

ITEMTYPEIDNAME
AR_ITEMS1Event A
AR_ITEMS2Event B
AP_ITEMS3Event C

内容的提问来源于stack exchange,提问作者to-find

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:00:02