Oracle
 sql >> база данни >  >> RDS >> Oracle

Извличане на xml данни чрез заявка на oracle

Бих извлякъл данните на етапи:

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 съдържа всеки от AuxiliaryObject екземпляри в рамките на AuxiliaryType , от вашия оригинален XML текст. Той има атрибутите name и id , плюс под-XMLType, съдържащ вложените редове. Втората XMLTable, xrows , разширява това, така че елементите да могат да бъдат извлечени. Обединяването и предаването на XML типовете създава йерархията, която дава желания резултат:

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                           

Това работи в SQL Developer срещу база данни 11.2.0.3 и в SQL Fiddle .

По-ранна базирана на CTE версия на този отговор също работеше в SQL Developer, но SQL Fiddle получи грешка ORA-600; това заедно с проблема, който сте имали във въпроса, подсказва, че може би SQL Fiddle е на непоправена или поне различно коригирана версия на 11gR2, която има грешки в обработката на 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. Преобразуване между клаузи в съединения

  2. процедура на Oracle с помощта на команда Host().

  3. групово събиране, използвайки за актуализация

  4. Списък за връщане<String> с помощта на Spring jdbc от съхранена процедура на Oracle с персонализиран обект

  5. Еквивалент на Oracle ISNULL().