Как я могу использовать xmltype для извлечения значения определенного тега XML-документа в случае, если у меня есть больше тегов с тем же именем?

Я новичок в Oracle, и у меня есть следующая проблема с извлечением определенного поля из XML-документа, который находится внутри поля CLOG таблицы в БД.

Итак, в моем XML у меня есть эта структура:

<?xml version="1.0" encoding="UTF-8"?>
<in:Invoice xmlns:in="urn:oasis:.....">

    <cac:AccountingSupplierParty>
        <cac:Party>
            .............................
            .............................

            /* FIRST cac:PartyLegalEntity that contains a cbc:CompanyID element */
            <cac:PartyLegalEntity>
                <cbc:CompanyID>VALUE-1</cbc:CompanyID>
                .............................
                .............................
                </cac:RegistrationAddress>
            </cac:PartyLegalEntity>

            /* SECOND cac:PartyLegalEntity that contains a cbc:CompanyID element */
            <cac:PartyLegalEntity>
                <cbc:CompanyID>VALUE-2</cbc:CompanyID>
                .............................
                .............................
            </cac:PartyLegalEntity>

        </cac:Party>
    </cac:AccountingSupplierParty>
</in:Invoice>

Итак, теперь в запросе я должен получить строковое значение, содержащееся в элементе cbc:CompanyID внутри элемента SECOND cac:PartyLegalEntity (VALUE-2< /сильное> значение).

Я сделал таким образом:

xmltype (d.documento).EXTRACT (
      '//cac:AccountingSupplierParty//cac:PartyLegalEntity/cbc:CompanyID/text()')
      .getStringVal() AS PIVA_MITTENTE

Но, делая таким образом, результатом моего запроса является строка со столбцом PIVA_MITTENTE, которая содержит значение VALUE-1VALUE-2 вместо VALUE-2. strong> именно этого я и хочу.

Я думаю, проблема в том, что тег контейнера () одинаков как для тега (имеющего одинаковое имя), так и в этот тег я извлекаю значение одного и того же тег .

Я не могу изменить XML, поэтому могу ли я каким-то образом указать, что мне нужно значение тега , которое находится внутри тега SECOND, в мой XML? Как я могу это сделать и решить эту проблему?

ИЗМЕНИТЬ 1:

Мой исходный запрос таков:

SELECT

xmltype (d.documento).EXTRACT (
      '//cac:AccountingSupplierParty//cac:PartyLegalEntity/cac:RegistrationAddress/cbc:PostalZone/text()')
      .getStringVal() AS CAP_MITTENTE,  

xmltype (d.documento).EXTRACT (
      '//cac:AccountingSupplierParty//cac:PartyLegalEntity/cbc:CompanyID/text()')
      .getStringVal() AS PIVA_MITTENTE

FROM coda_tx c, documenti_tx d
WHERE   C.FK_TIPO_DOC = 99
        AND C.FK_STATO = 1
        AND C.FK_PIVA_MITTENTE = '11111111'
        AND C.PK_CODA = D.PFK_CODA
        AND C.CANALE='STA';

Второй xmltype (d.documento).EXTRACT — это тот, который дает мне описанную проблему.

Как я могу интегрировать использование XMLTABLE в мой предыдущий запрос?


person AndreaNobili    schedule 19.02.2015    source источник


Ответы (1)


Вам необходимо использовать функцию XMLTable. Ваш запрос будет выглядеть примерно так:

Вот пример из документа:

SELECT warehouse_name warehouse,
   warehouse2."Water", warehouse2."Rail"
   FROM warehouses,
   XMLTABLE('/Warehouse'
      PASSING warehouses.warehouse_spec
      COLUMNS 
         "Water" varchar2(6) PATH '/Warehouse/WaterAccess',
         "Rail" varchar2(6) PATH '/Warehouse/RailAccess') 
      warehouse2;

Я считаю, что вы можете понять, как передать свой XPATH.

ОБНОВЛЕНИЕ: В вашем случае это будет выглядеть примерно так:

SELECT d.*,
       x.company_id
 FROM d,
      XMLTABLE('//cac:AccountingSupplierParty//cac:PartyLegalEntity/'
              PASSING d.documento 
              COLUMNS company_id varchar2(6) PATH '/cbc:CompanyID'
              ) x;
person Rusty    schedule 19.02.2015
comment
ммм я абсолютно новичок в этой области. Можете ли вы показать мне фрагмент кода, относящийся к моему конкретному случаю? - person AndreaNobili; 19.02.2015
comment
Да, не могли бы вы дать мне определение вашей таблицы? - person Rusty; 19.02.2015
comment
какой стол нужен? Предыдущий запрос выполняется для поля CLOB (содержащего XML) таблицы. Поэтому я думаю, что запрос выполняется в XML с помощью XPATH или что-то в этом роде. Что мне не хватает? - person AndreaNobili; 19.02.2015
comment
ммм, когда я пытаюсь интегрироваться в свой запрос, это не работает. Я отредактировал свой исходный пост, добавив в него весь запрос, в который я должен интегрировать статус XMLTABLE. - person AndreaNobili; 19.02.2015