Как мога да използвам xmltype за извличане на стойността на конкретен таг на XML документ в случай, че имам още таг със същото име?

Аз съм доста нов в Oracle и имам следния проблем с извличането на конкретно поле от XML документ, който е вътре в CLOG поле на таблица в DB.

И така, в моя 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< /strong> стойност).

Направих по този начин:

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

Но по този начин резултатът от моята заявка е ред с колоната PIVA_MITTENTE, който съдържа стойността VALUE-1VALUE-2 вместо VALUE-2 това е, което искам.

Мисля, че проблемът е, че маркерът на контейнера () е един и същ и за етикета (които имат едно и също име) и в този маркер извличам стойността на същото таг .

Не мога да модифицирам 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