sql >> Database teknologi >  >> RDS >> Oracle

Udtræk xml-data ved hjælp af oracle-forespørgsel

Jeg ville udtrække dataene i etaper:

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;

XML-tabellen xobjects indeholder hver af AuxiliaryObject forekomster inden for AuxiliaryType , fra din originale XML-tekst. Den har attributterne name og id , plus en under-XMLType, der indeholder de indlejrede rækker. Den anden XML-tabel, xrows , udvider det, så elementerne kan udvindes. Sammenkædningen og overførslen af ​​XML-typerne skaber det hierarki, der giver det output, du ønsker:

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                           

Dette virker i SQL Developer mod en 11.2.0.3 database og i SQL Fiddle .

En tidligere CTE-baseret version af dette svar fungerede også i SQL Developer, men SQL Fiddle a> fik en ORA-600 fejl; at det sammen med det problem, du havde i spørgsmålet, tyder på, at SQL Fiddle måske er på en ikke-patchet, eller i det mindste anderledes patchet, version af 11gR2, som har fejl i XML-håndteringen.




  1. mysql_connect():Der kunne ikke oprettes forbindelse, fordi målmaskinen aktivt afviste det

  2. Indstil DataGridView.DataSource async

  3. Hvorfor bruger `libpq` polling i stedet for notifikation til datahentning?

  4. vælg sum indtil et bestemt beløb og opdater derefter visse felter baseret på betingelse