sql >> Databáze >  >> RDS >> Oracle

Extrahujte data xml pomocí dotazu Oracle

Extrahoval bych data po etapách:

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 obsahuje každý z AuxiliaryObject instance v rámci AuxiliaryType , z vašeho původního textu XML. Má atributy name a id , plus sub-XMLType obsahující vnořené řádky. Druhá tabulka XML, xrows , rozšíří, aby bylo možné prvky extrahovat. Spojení a předání typů XML vytváří hierarchii, která poskytuje požadovaný výstup:

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                           

Funguje to v SQL Developer proti databázi 11.2.0.3 a v SQL Fiddle .

Dřívější verze této odpovědi založená na CTE také fungovala v SQL Developer, ale SQL Fiddle došlo k chybě ORA-600; že spolu s problémem, který jste měli v otázce, naznačuje, že možná je SQL Fiddle na neopravené nebo alespoň jinak opravené verzi 11gR2, která má chyby ve zpracování XML.




  1. Existuje jednoduchý způsob, jak převést data MySQL do Title Case?

  2. Získávání nekompatibilního kódování znaků:Chyba UTF-8 a ASCII-8BIT při zobrazení uživatelem zadaného znaku ASCII-8BIT

  3. Místo spouštěče v SQL Server ztrácí SCOPE_IDENTITY?

  4. Na co Hibernate mapuje booleovský datový typ při výchozím použití databáze Oracle?