繁体   English   中英

oracle xmlexists具有可变路径

[英]oracle xmlexists with variable path

我有一个包含两列的表tsk:一个编号为任务的id,以及一个XMLTYPE的任务范围,可以像这样:

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

但是标签下的元素可能会因一条记录而异

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

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

由于范围可能会有所不同,我有一个PL / SQL函数,采用xml路径p_xmlpath来查找,格式为varchar2。 因此,例如,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吗?

附加信息:到目前为止,我使用了函数existNode,并且以下查询正确完成了该工作:

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

但是一方面不赞成使用现存节点,另一方面,我注意到在我的情况下,xmlexists函数的速度明显快于existsNode,这就是为什么我要改用xmlexists的原因。

提前致谢。

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

解决方法是,可以在runtome上使用replace()构建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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM