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