2017-02-19 6 views
1

У меня XML такой. Я не могу разобрать его в таблицуoracle XML to Database table

<REQMST> 
    <ROW> 
    <REQ_ID>668 </REQ_ID>  
     <RequestDetails> 
     <REQ_DTL_ID>845</REQ_DTL_ID> 
     <INTERFACE_REFNUM>1</INTERFACE_REFNUM> 
     </RequestDetails> 
     <RequestDetails> 
     <REQ_DTL_ID>846</REQ_DTL_ID> 
     <INTERFACE_REFNUM>2</INTERFACE_REFNUM> 
     </RequestDetails>  
    </ROW> 
</REQMST> 

Я пытаюсь разобрать его в таблицу, используя

select * 
FROM XMLTABLE('/REQMST/ROW' 
     PASSING 
      xmltype(' 
      <REQMST> 
    <ROW> 
    <REQ_ID>668 </REQ_ID>  
     <RequestDetails> 
     <REQ_DTL_ID>845</REQ_DTL_ID> 
     <INTERFACE_REFNUM>1</INTERFACE_REFNUM> 
     </RequestDetails> 
     <RequestDetails> 
     <REQ_DTL_ID>846</REQ_DTL_ID> 
     <INTERFACE_REFNUM>2</INTERFACE_REFNUM> 
     </RequestDetails>  
    </ROW> 
</REQMST>') 
     COLUMNS 
      --describe columns and path to them: 
      REQ_ID varchar2(20)     PATH './REQ_ID', 
      REQ_DTL_ID varchar2(20)   PATH './RequestDetails/REQ_DTL_ID', 
      INTERFACE_REFNUM varchar2(20)  PATH './RequestDetails/INTERFACE_REFNUM' 
    ) xmlt 
; 

Я получаю ошибки ORA-19279: XPTY0004 - XQuery dynamic type mismatch: expected singleton sequence - got multi-item sequence

это работает, если есть только один RequestDetails

ответ

1

Вам нужно пройти еще один уровень вниз, чтобы получить информацию от тега RequestDetails, используя ту же технику, что и родительский.

Б Имя столбца xml, чтобы получить XML в столбце XmlType, а затем использовать XMLTABLE на нем, чтобы получить более подробную информацию:

Попробуйте это:

select xmlt.req_id, x.REQ_DTL_ID, x.INTERFACE_REFNUM 
FROM XMLTABLE('/REQMST/ROW' 
     PASSING 
      xmltype(' 
      <REQMST> 
       <ROW> 
        <REQ_ID>668 </REQ_ID>  
        <RequestDetails> 
         <REQ_DTL_ID>845</REQ_DTL_ID> 
         <INTERFACE_REFNUM>1</INTERFACE_REFNUM> 
        </RequestDetails> 
        <RequestDetails> 
         <REQ_DTL_ID>846</REQ_DTL_ID> 
         <INTERFACE_REFNUM>2</INTERFACE_REFNUM> 
        </RequestDetails>  
       </ROW> 
      </REQMST>') 
     COLUMNS 
      --describe columns and path to them: 
      REQ_ID varchar2(20)     PATH 'REQ_ID', 
      xml xmltype   PATH 'RequestDetails' 
    ) xmlt, xmltable('/RequestDetails' 
     passing xmlt.xml 
     columns 
      REQ_DTL_ID varchar2(20)   PATH 'REQ_DTL_ID', 
      INTERFACE_REFNUM varchar2(20)  PATH 'INTERFACE_REFNUM' 
    ) x; 

Производит:

REQ_ID REQ_DTL_ID INTERFACE_REFNUM 
668  845   1 
668  846   2