从多级 XML(嵌套在不同级别的数据)中提取数据的标准方法是将调用级联到 xmltable。像这样的东西;注意嵌套的“文档”<item> 在第一次传递中是如何被提取为xmltype,然后作为第二次调用xmltable 的基础传递。
select t.id, x1.header_attr1, x1.header_attr2, x2.item_attr1, x2.item_attr2
from t
cross apply
xmltable('/body' passing xmltype(xmlstr)
columns header_attr1 varchar2(20) path 'header/header_attr1',
header_attr2 varchar2(20) path 'header/header_attr2',
item xmltype path 'item'
) x1
cross apply
xmltable('/item' passing item
columns item_attr1 varchar2(20) path 'item_attr1',
item_attr2 varchar2(20) path 'item_attr2'
) x2
;
这将产生以下输出:
ID HEADER_ATTR1 HEADER_ATTR2 ITEM_ATTR1 ITEM_ATTR2
------ ---------------- ---------------- ---------------- --------------
3001 attr1 attr2 attr11 attr12
3001 attr1 attr2 attr21 attr22
3001 attr1 attr2 attr31 attr32
2048 attr201 attr202 attr--11 attr--12
2048 attr201 attr202 attr--21 attr--22
2048 attr201 attr202 attr--31 attr--32
来自以下示例数据:
create table t (id, xmlstr) as
select 3001,
'<body>
<header>
<header_attr1>attr1</header_attr1>
<header_attr2>attr2</header_attr2>
</header>
<item>
<item_attr1>attr11</item_attr1>
<item_attr2>attr12</item_attr2>
</item>
<item>
<item_attr1>attr21</item_attr1>
<item_attr2>attr22</item_attr2>
</item>
<item>
<item_attr1>attr31</item_attr1>
<item_attr2>attr32</item_attr2>
</item>
</body>'
from dual union all
select 2048,
'<body>
<header>
<header_attr1>attr201</header_attr1>
<header_attr2>attr202</header_attr2>
</header>
<item>
<item_attr1>attr--11</item_attr1>
<item_attr2>attr--12</item_attr2>
</item>
<item>
<item_attr1>attr--21</item_attr1>
<item_attr2>attr--22</item_attr2>
</item>
<item>
<item_attr1>attr--31</item_attr1>
<item_attr2>attr--32</item_attr2>
</item>
</body>'
from dual;