具有可变路径的oracle xmlexists

时间:2017-06-16 10:06:25

标签: sql oracle plsql xmltype oracle-xml-db

我有一个包含2列的表tsk:数字中的任务ID,以及XMLTYPE中的任务范围,可以是:

<scope>
    <siteCode>2</siteCode>
    <supplierCode>1111</supplierCode>
    <contractCode>464</contractCode>
    <orderNumber>85235478</orderNumber>
</scope>

但标签下的元素可能因记录而异[/ p>

我需要选择与范围中某些条件匹配的任务ID。 例如:

select tskid
from tsk t 
where xmlexists('$a/scope[siteCode = 2 and supplierCode = 111]' passing t.tskscope as "a");

由于范围可能不同,我有一个PL / SQL函数,在varchar2类型中使用xml路径p_xmlpath来查找。 例如,p_xmlpath将是:

p_xmlpath := 'scope[siteCode = 2 and supplierCode = 1111]';

然后我想用XMLEXISTS运行查询以查找匹配的记录。 我想用以下方式用绑定变量来做:

select tskid
from tsk t 
where xmlexists('$a/$b' passing t.tskscope as "a", p_xmlpath as "b" );

通过执行此操作,查询将返回所有记录,而不会使用xmlexists。

有人知道如何管理这个,即有一个可变路径来提供给XMLEXISTS吗?

其他信息:到目前为止,我使用函数existsNode并且以下查询正确地完成了这项工作:

select tskid
from tsk t 
where existsnode(t.tskscope, p_xmlpath) = 1;

但是一方面不推荐使用existsNode,另一方面我注意到在我的情况下xmlexists函数明显比existsNode快,这就是为什么我要切换到xmlexists的原因。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我认为你不能;它似乎只允许搜索值为变量,而不是整个搜索条件。

作为一种解决方法,您可以使用replace()

在runtome上构建XPath
select tskid
from tsk t 
where xmlexists(replace('$a/$b', '$b', p_xmlpath) passing t.tskscope as "a");

或者将XPath字符串构建为变量,如果您不想在其中进行替换,并包含$a/部分:

p_xmlpath := '$a/' || p_xmlpath;

select tskid
from tsk t 
where xmlexists(p_xmlpath passing t.tskscope as "a");