Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wyodrębnij dane xml za pomocą zapytania Oracle

Dane wyodrębniłbym etapami:

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;

XMLTable xobjects zawiera każdy z AuxiliaryObject instancje w AuxiliaryType , z oryginalnego tekstu XML. Posiada atrybuty name i id , plus podrzędny XMLType zawierający zagnieżdżone wiersze. Druga tabela XML, xrows , rozszerza to, aby można było wyodrębnić elementy. Sprzężenia i przekazywanie typów XML tworzy hierarchię, która daje pożądany wynik:

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                           

Działa to w SQL Developer z bazą danych 11.2.0.3 oraz w SQL Fiddle .

Wcześniejsza wersja tej odpowiedzi, oparta na CTE, działała również w programie SQL Developer, ale SQL Fiddle dostałem błąd ORA-600; że wraz z problemem, który miałeś w pytaniu, sugeruje, że być może SQL Fiddle jest w niezałatanej lub przynajmniej w inny sposób załatanej wersji 11gR2, która ma błędy w obsłudze XML.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. org.hibernate.Query .iterate() VS .getResultList() generowanie zapytań

  2. Szukaj wewnątrz tabeli Typ rekordów

  3. Błąd zamknięcia Oracle ORA-01033

  4. ora-01406 Błąd podczas pobierania wartości za pomocą OCI

  5. dlaczego tablica asocjacyjna indeksowana przez VARCHAR2 nie przechowuje więcej niż 9 elementów