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