【问题标题】:oracle XML to Database tableoracle XML 到数据库表
【发布时间】:2017-07-08 17:17:45
【问题描述】:

我有这样的 XML。我无法将其解析为表格

  <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 就可以了

【问题讨论】:

    标签: sql xml oracle oracle11g


    【解决方案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
    

    【讨论】: