Как извлечь / обновить значения атрибута в Oracle 12g XML по значению атрибута - PullRequest
0 голосов
/ 10 июля 2019

Здравствуйте, я новичок в Oracle XML DB, но должен извлечь значения атрибута с помощью другого значения атрибута.

Упрощенный документ выглядит следующим образом:

<ApplicationDataNotification>
    <ApplicationData>
        <DataSet Name="A1">
            <Data DataElement="PAND" Value="A100"/>
            <Data DataElement="MKDI" Value="007"/>
        </DataSet>
        <DataSet Name="A2">
            <Data DataElement="PAND" Value="B200"/>
            <Data DataElement="MKDI" Value="900"/>
        </DataSet>
    </ApplicationData>
</ApplicationDataNotification>

Если использовать позиционную нотациюэто работает (возвращает: A100):

with testTable(xml_val) 
as (  
    select xmltype(  
    '    
        <ApplicationDataNotification>
            <ApplicationData>
                <DataSet Name="A1">
                    <Data DataElement="PAND" Value="A100"/>
                    <Data DataElement="MKDI" Value="007"/>
                </DataSet>
                <DataSet Name="A2">
                  <Data DataElement="PAND" Value="B200"/>
                  <Data DataElement="MKDI" Value="900"/>
                </DataSet>
            </ApplicationData>
        </ApplicationDataNotification>
    ') from dual)  
select xmlcast(xmlquery('/ApplicationDataNotification/ApplicationData/DataSet[1]/Data[1]/@Value' passing xml_val returning content) as varchar2(2000)) as PAN
    from testTable;

Но проблема в том, что порядок тегов xml не фиксирован.

Таким образом, я попытался использовать этот подход:

with testTable(xml_val) 
as (  
    select xmltype(  
    '    
        <ApplicationDataNotification>
            <ApplicationData>
                <DataSet Name="A1">
                  <Data DataElement="PAND" Value="A100"/>
                  <Data DataElement="MKDI" Value="007"/>
                </DataSet>
                <DataSet Name="A2">
                  <Data DataElement="PAND" Value="B200"/>
                  <Data DataElement="MKDI" Value="900"/>
                </DataSet>
            </ApplicationData>
        </ApplicationDataNotification>
        ') from dual)  
select xmlcast(xmlquery('/ApplicationDataNotification/ApplicationData/DataSet[Name="A1"]/Data[DataElement="PAND"]/@Value' passing xml_val returning content) as varchar2(2000)) as PAN
    from testTable;

И возвращается ноль.

Извините, но я озадачен ... Не могли бы вы помочь, пожалуйста!Как переписать запрос, чтобы заставить работать?PS: Oracle 12g

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

С выражением FLWOR может быть что-то вроде этого:

with testTable(xml_val) 
as (  
    select xmltype(  
    '    
        <ApplicationDataNotification>
            <ApplicationData>
                <DataSet Name="A1">
                  <Data DataElement="PAND" Value="A100"/>
                  <Data DataElement="MKDI" Value="007"/>
                </DataSet>
                <DataSet Name="A2">
                  <Data DataElement="PAND" Value="B200"/>
                  <Data DataElement="MKDI" Value="900"/>
                </DataSet>
            </ApplicationData>
        </ApplicationDataNotification>
        ') from dual)  
select xmlquery('for $i in /ApplicationDataNotification/ApplicationData/DataSet
                 let $j := $i/Data[@DataElement = "PAND"]
                 where $i/@Name eq "A1" 
                 return $j/@Value'
                 passing xml_val returning content) colval
  from testTable;
0 голосов
/ 11 июля 2019

Извините, ребята, это просто: «@» Опущено выберите xmlcast (xmlquery ('/ ApplicationDataNotification / ApplicationData / DataSet [@ Name = "A1"] / Data [@ DataElement = "PAND"] / @ Value', передающий xml_val возвращающее содержимое) как varchar2 (2000)) в качестве PAN из testTable;

...