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

标签 sql oracle

我有一项可能令人羡慕的任务,即编写数据迁移查询以使用添加到生产数据库表中的新列的值填充现有记录。该表的某处大约有 200,000 行。

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

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

有人对这个有了解吗?我不是 SQL 专家,即便如此,我在 SQL Server 上花费的时间也比 Oracle 多。因此,如果我无法使其正常工作,我想我将不得不处理光标或其他事情。

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

最佳答案

几乎可以肯定,源 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;

关于sql - 当查询返回多行时,Oracle extractValue 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/995229/

相关文章:

mysql - 查询和存储过程返回不同的结果

SQL检查表是否存在并截断

sql - ORA-02437 : cannot validate <name> - primary key violated

sql - 在 PL/SQL 中创建临时表

sql - 加快 oracle sql 删除查询

sql - 如何用另一个表的列中的值来约束一列?

sql - 有条件地替换 SELECT 中的值

sql - 不像条件太慢的地方

mysql - varchar(limit) 是如何工作的?

java - Oracle PL/SQL 使用字节数组更新