在xmltype中查找xml声明

时间:2018-08-09 09:56:13

标签: sql oracle11g

我正在尝试编写一个谓词,以查找包含xml声明的xmltype列

<?xml version="1.0" encoding="UTF-8"?>

到目前为止,我已经提出:

where regexp_like(substr(XMLSERIALIZE(DOCUMENT my_xmltype_col AS CLOB),1,100),'<?xml version=')

ie将xmltype列的第1个100个字符转换为字符串,然后对该字符串执行regexp_like。这显然不是很快,而且我有一张大桌子要搜索。有谁有更好的主意吗?

1 个答案:

答案 0 :(得分:1)

您无法使用XML查询直接搜索XML声明,因为XPath不可见该声明。您要做的工作比您需要做的要多。不需要XMLSerialize调用,并且使用likeregexp_like更快;但是当您寻找固定的字符串时,您可以仅使用相等检查,例如

select *
from your_table t
where dbms_lob.substr(t.my_xmltype_col.getclobval(), 5, 1) = '<?xml';

如果需要,您可以捕获更多字符并比较更长的固定字符串,但这足以表明您有一个声明。

如果您担心XML开头不正确(有可能吗?),您可以搜索它:

select *
from your_table t
where dbms_lob.instr(t.my_xmltype_col.getclobval(), '<?xml') > 0;

,但是那样将不得不在没有匹配项的情况下浏览整个文档,因此对于那些人来说可能很慢。因此,如果您认为{@ 1}会发生,并且可以非常自信,那么可以与dbms_lob.substr()结合使用,例如,

select *
from your_table t
where dbms_lob.instr(dbms_lob.substr(t.my_xmltype_col.getclobval(), 100, 1), '<?xml') > 0;