我是使用Oracle数据库的。我的一个表中有一列是XMLTYPE类型的。现在,问题是我需要提取那些具有特定根元素和另一个条件的记录的计数。假设存储的XML格式如下:
<ns1:Warehouse whNo="102" xmlns:ns1="xyz">
<ns1:Building></ns1:Building>
</ns1:Warehouse>
"and"。
<ns1:Warehouse whNo="102" xmlns:ns1="xyz">
<ns1:Building>Owned</ns1:Building>
</ns1:Warehouse>
还有其他根元素不是Warehouse的XML文件
现在,我需要获取那些满足以下条件的记录:
- 根元素为Warehouse
- Building元素为空
我编写了以下SQL查询语句:
select count(XMLQuery('declare namespace ns1="xyz.com";
for $i in /*
where fn:local-name($i) eq "Warehouse"
and fn:string-length($i/ns1:Building ) = 0
return <Test>{$i/ns1:Building}</Test>'
PASSING xml_response RETURNING CONTENT)) countOfWareHouses
from test
这里,“test”是表的名称,“*xml_response*”是表“test”中XMLTYPE列的名称。
当记录较少时,此查询可以正常工作。我已经在表中测试了约500条记录,并且所需时间约为0.1秒。但是随着表中记录数量的增加,所需时间也会增加。当我将记录数量增加到5000时,所需时间为约11秒。对于一个存储了185000条记录的生产表来说,此查询永远无法完成。
请帮助我优化此查询或xquery。
编辑1:
我尝试使用以下内容:
select count(XMLQuery(
'declare namespace ns1 = "xyz";
for $i in /
return /ns1:Warehouse[not(ns1:Building/text())]'
PASSING xml_response RETURNING CONTENT))
from test
并且
select count(XMLQuery(
'declare namespace ns1 = "xyz";
return /ns1:Warehouse[fn:string-length(ns1:Building)=0]'
PASSING xml_response RETURNING CONTENT))
from test
但是这并没有起作用。
当我尝试运行它们时,它会要求绑定 Building 和 Warehouse 的值。