当查询返回许多行时,Oracle extractValue失败

时间:2009-06-15 09:37:34

标签: sql oracle

我有一个可能不值得苛刻的任务,即编写数据迁移查询来填充现有记录,并将新列的值添加到生产数据库的表中。该表有大约200,000行。

值的来源是存储在数据库中的某些XML。我有一些XPath会提取我想要的值,并且使用extractValue来获取值似乎都很好,直到查询更新的记录数量开始变得比我在测试数据库中的数量更大。

一旦记录集增长到一些随机的大小,大约500行,那么我开始得到错误“ORA-19025:EXTRACTVALUE只返回一个节点的值”。确定数据库中有一些奇怪的行,对于XPath没有唯一的结果,我试图限制查询中的记录以隔离坏记录。但是一旦我缩小了记录集,错误就消失了。实际上没有行会为此XPath查询返回多个值。看起来,extractValue会发生一些可疑的事情。

有人对此有所了解吗?我不是SQL专家,即便在SQL Server上花费的时间也比Oracle多。因此,如果我不能让它工作,我想我只能做一些搞乱游标或其他东西。

有任何建议/帮助吗?如果有帮助,我们在服务器上运行10g。谢谢!

1 个答案:

答案 0 :(得分:5)

几乎可以肯定,带有源XML的表中至少有一行具有无效值。重写查询以尝试找到它。

例如,使用XMLPath谓词,它将为您提供第二个位置的节点(我目前无法访问带有XML对象的数据库,因此我不能保证以下语法完美):

  SELECT SourceKey
       , EXTRACTVALUE(SourceXML, '/foo/bar/baz[1]')
       , EXTRACTVALUE(SourceXML, '/foo/bar/baz[2]')
    FROM SourceTable
   WHERE EXTRACTVALUE(SourceXML, '/foo/bar/baz[2]') IS NOT NULL;