Oracle XML存在可变路径



我有一个包含 2 列的表 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 函数,采用 varchar2 类型p_xmlpath查找的 xml 路径。 因此,例如,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 的条件。

有人知道如何管理它,即有一个变量路径提供给XMLEXIST吗?

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

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

但一方面 existNode 已被弃用,另一方面我注意到在我的情况下,函数 xmlexists 明显比 existsNode 快,这就是我要切换到 xmlexists 的原因。

提前谢谢。

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

作为一种解决方法,您可以使用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");

相关内容

  • 没有找到相关文章

最新更新