如何按属性值提取/更新 Oracle 12g XML 中的属性值



您好,我是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;

它返回空值。

对不起,我很困惑...你能帮忙吗!如何重写查询以使工作?附言:甲骨文12g

对不起,伙计们,很简单:省略"@"选择 xmlcast(xmlquery('/ApplicationDataNotification/ApplicationData/DataSet[@Name="A1"]/Data[@DataElement="PAND"]/@Value' 传递xml_val返回内容( 作为 varchar2(2000(( 作为 PAN 从测试表;

使用 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;

最新更新