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

Nia*_*ton 4 sql oracle

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

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

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

有人对这个有了解吗?我不是SQL专家,即便在SQL Server上花费的时间也比Oracle多.所以,如果我不能让它工作,我想我会留下一些弄乱游标或其他东西.

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

Ste*_*erg 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;
Run Code Online (Sandbox Code Playgroud)