使用existsNode在Oracle 11.2.0.3.0中进行奇怪的数字比较行为

时间:2014-06-20 11:39:55

标签: sql database oracle casting oracle11g

我正在尝试选择一个表的所有行,其中一列包含特定的xml值。 当我对我的本地数据库或我们的内部测试服务器运行查询时,它工作正常。但是,在客户测试服务器上,查询不会返回任何行。

SELECT * FROM product WHERE existsnode(...) = 1

我发现如果我引用比较值,它适用于所有数据库:

SELECT * FROM product WHERE existsnode(...) = '1'

我想了解为什么会发生这种情况,以及这个问题的良好解决方案。 所有系统上的数据库版本都是11.2.0.3.0。

修改 我做了一些进一步的研究,发现返回的数据类型实际上是一个数字,如Oracle文档中所述。

SELECT dump(existsNode(...)) FROM product;

在所有数据库上返回“Typ = 2,Len = 1:128”。

但是,我在existsnode查询字符串中有一些双引号,并且这些双引号似乎在我遇到奇怪的比较问题的数据库上丢失了:

SELECT existsnode(xmltype(attributes), '/attrs/attr[@name="SomeFlag"]') FROM product;

在查询工作的数据库中,我得到以下结果作为列名:

EXISTSNODE(XMLTYPE(ATTRIBUTES), '/ATTRS/ATTR[@NAME="SOMEFLAG"]')

在我得到的其他数据库

EXISTSNODE(XMLTYPE(ATTRIBUTES), '/ATTRS/ATTR[@NAME=SOMEFLAG]')

1 个答案:

答案 0 :(得分:2)

在support.oracle.com上查看文档编号,文档ID 14087914.8(错误号14087914)。

根据文档,尝试关注以查看结果是否产生您所期望的结果。

alter session set "_fix_control"='9569678:off

您的其他选择,涉及升级到11.2.0.4。