【发布时间】:2019-04-17 16:42:58
【问题描述】:
XML:
<import>
<persons>
<person>
<pm>57924160</pm>
<date_from>2018-05-01</date_from>
<info>
<set>
<indflag>0</indflag>
</set>
<items>
<item>
<symbol>a</symbol>
<date>2018-05-02</date>
<cost>190</cost>
</item>
<item>
<symbol>b</symbol>
<date>2018-05-02</date>
<cost>130</cost>
</item>
</items>
</info>
</person>
</persons>
<persons>
<person>
<pm>57924160</pm>
<date_from>2018-05-01</date_from>
<info>
<set>
<indflag>0</indflag>
</set>
<items>
<item>
<symbol>a</symbol>
<date>2018-05-02</date>
<cost>190</cost>
</item>
<item>
<symbol>b</symbol>
<date>2018-05-02</date>
<cost>130</cost>
</item>
</items>
</info>
</person>
</persons>
</import>
我通过以下方式循环读取此 xml:
SELECT xt.*
FROM XMLTABLE(
'//import/persons/person'
PASSING xmltype('above_xml')
COLUMNS
pm VARCHAR2(4) PATH 'pm',
indflag VARCHAR2(10) PATH 'info/set/indflag'
) xt;
但如果我添加另一列
item varchar2(10) PATH 'info/items/item/symbol'
它给了我 ORA,因为 xmltable 期望每人 1 个值,并且每个人有两个项目。
当然,我可以在 pl/sql 中处理它,例如获取完整的人员节点、选择所有项目等,但我想知道这是否可以在单个查询中完成,以获得如下输出:
PM INDFLAG item
5792 0 a
5792 0 b
【问题讨论】:
-
每个人有多个项目/符号,所以您现在不希望结果集中有四行吗?