Intereting Posts

Извлечение данных xml с использованием запроса oracle

Версия Oracle 11g

HI. При попытке прочитать XML в LOOP запрос дает ошибку, но если я изменяю это на не существующий путь, тогда запрос работает нормально. Однако значение @Name не является ожидаемым. Что я должен здесь исправить, чтобы дать ему желаемый результат, указанный ниже:

Ссылка sqlfiddle

Неиспользуемый путь, описанный выше, удалил E из имени: for $i in AuxiliaryObject/Row return <C>{$i}<R>{AuxiliaryObject/@NAM}

код:

  SELECT * FROM XMLTABLE ( '<C> {for $i in AuxiliaryObject/Row return <C>{$i}<R>{AuxiliaryObject/@NAM}</R></C>}</C>/C' 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>' ).EXTRACT ('AuxiliaryType/*') COLUMNS Name varchar (30) Path 'R/@NAME', Index_Id VARCHAR2 (10) PATH 'Row/Index_id', Provider_id_description VARCHAR2 (30) PATH 'Row/Provider_ID_description', provider_id VARCHAR2 (30) PATH 'Row/Provider_ID') 

Выход: Желаемый:

 ID, Provider_Name, Index, Provider_ID_description, Provider_ID 1 Provider_P107 1 GNRCN GNRCN 1 Provider_P107 2 INDF1 INDF1 2 Provider_P108 2 EGUT12 EGUT12 2 Provider_P108 1 EGUT EGUT 

Выход идет по ссылке sqlfiddle.

Вышеупомянутая Queation – это ссылка на это: Извлеките данные из XML и загрузите их в таблицу

Когда я запускаю запрос на Toad: Output is:

 NAME INDEX_ID PROVIDER_ID_DESCRIPTION PROVIDER_ID Provider_P107Provider_P108 1 GNRCN GNRCN Provider_P107Provider_P108 2 EGUT12 EGUT12 Provider_P107Provider_P108 1 GNRCN GNRCN Provider_P107Provider_P108 2 EGUT EGUT 

    Я бы извлек данные поэтапно:

     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 , плюс sub-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.