Oracle
 sql >> Datenbank >  >> RDS >> Oracle

XML-Daten mit Oracle-Abfrage extrahieren

Ich würde die Daten schrittweise extrahieren:

SELECT xobjects.id, xobjects.name, xrows.index_id,
  xrows.provider_id_description, xrows.provider_id
FROM XMLTABLE(
    '/AuxiliaryType/AuxiliaryObject'
    PASSING xmltype(
               '<AuxiliaryType>
                 <AuxiliaryObject id="1" NAME="Provider_P107">
                         <Row>
                              <Index_id>1</Index_id>
                              <Provider_ID_description>GNRCN</Provider_ID_description>
                              <Provider_ID>GNRCN</Provider_ID>
                         </Row>

                          <Row>
                              <Index_id>2</Index_id>
                              <Provider_ID_description>EGUT12</Provider_ID_description>
                              <Provider_ID>EGUT12 </Provider_ID>
                         </Row>
                 </AuxiliaryObject>
                 <AuxiliaryObject id="2" NAME="Provider_P108">
                         <Row>
                              <Index_id>1</Index_id>
                              <Provider_ID_description>GNRCN</Provider_ID_description>
                              <Provider_ID>GNRCN</Provider_ID>
                         </Row>

                          <Row>
                              <Index_id>2</Index_id>
                              <Provider_ID_description>EGUT</Provider_ID_description>
                              <Provider_ID>EGUT </Provider_ID>
                         </Row>
                 </AuxiliaryObject>

                </AuxiliaryType>'
    )
    COLUMNS 
    name VARCHAR2(30) PATH '@NAME',
    id VARCHAR2(10) PATH '@id',
    xrows XMLTYPE PATH 'Row') xobjects,
  XMLTABLE(
    '/Row'
    PASSING xobjects.xrows
    COLUMNS
    index_id VARCHAR2(10) PATH 'Index_id', 
    provider_id_description VARCHAR2(30) PATH 'Provider_ID_description',
    provider_id  VARCHAR2(30) PATH 'Provider_ID') xrows;

Die XMLTable xobjects enthält jedes der AuxiliaryObject Instanzen innerhalb des AuxiliaryType , aus Ihrem ursprünglichen XML-Text. Es hat die Attribute name und id , plus einen untergeordneten XMLType, der die verschachtelten Zeilen enthält. Die zweite XMLTable, xrows , erweitert das, sodass die Elemente extrahiert werden können. Die Verknüpfungen und Übergabe der XML-Typen erstellt die Hierarchie, die die gewünschte Ausgabe liefert:

ID         NAME                           INDEX_ID   PROVIDER_ID_DESCRIPTION        PROVIDER_ID                  
---------- ------------------------------ ---------- ------------------------------ ------------------------------
1          Provider_P107                  1          GNRCN                          GNRCN                          
1          Provider_P107                  2          EGUT12                         EGUT12                         
2          Provider_P108                  1          GNRCN                          GNRCN                          
2          Provider_P108                  2          EGUT                           EGUT                           

Dies funktioniert in SQL Developer mit einer 11.2.0.3-Datenbank und in SQL Fiddle .

Eine frühere CTE-basierte Version dieser Antwort funktionierte auch in SQL Developer, aber SQL Fiddle bekam einen ORA-600-Fehler; Das zusammen mit dem Problem, das Sie in der Frage hatten, deutet darauf hin, dass sich SQL Fiddle möglicherweise auf einer ungepatchten oder zumindest anders gepatchten Version von 11gR2 befindet, die Fehler in der XML-Verarbeitung aufweist.