PL/SQL 比较 XMLTypes

Posted

技术标签:

【中文标题】PL/SQL 比较 XMLTypes【英文标题】:PL/SQL Compare XMLTypes 【发布时间】:2020-02-21 19:33:17 【问题描述】:

我有一个像队列一样使用的 SQL 表,其中一个列作为 XMLType。我试图对表做的是创建一个程序来获取数据的特定部分,遍历表,读取信息,然后在我完成后删除行。完成后我不能只清除整个表,因为并非所有数据都需要删除。

我目前的解决方案:

   FOR xml_data FROM (SELECT xml_column from table_a) 
   LOOP
   -- Process the data
   ...

   --- Delete the row
   DELETE FROM table_a where xml_column = xml_data.xml_column;
   END LOOP;

但是,我遇到了删除部分引发错误的问题:

  Error report -
  ORA-22950: cannot ORDER objects with MAP or ORDER method
  ...
  Action: Define a MAP or ORDER method for the object type

有谁知道这个问题的解决方案是什么?我也对其他解决方案持开放态度,可以在迭代后删除一行。

编辑:修复代码

【问题讨论】:

你需要发minimal reproducible example 我做了一些小的改动,但这几乎是最低限度的。我的问题几乎可以归结为“你如何比较 XMLTypes?” 【参考方案1】:

大型或复杂的对象不能与等号进行简单的比较。 Oracle 试图在这里为您提供帮助,因为比较大对象可能会导致性能问题,而且比较 XML 有不同的方法。错误消息ORA-22950 告诉您,如果您构建了特定的比较函数,您可以比较对象。

但在这种情况下,不需要直接比较 XML。如果您正在遍历表中的行,则通过ROWID(指向行位置的物理指针)识别行会快得多。

begin
    for xml_data in (select rowid, xml_column from table_a)
    loop
        -- Process the data
        -- ...

        delete from table_a where rowid = xml_data.rowid;
    end loop;
end;
/

【讨论】:

以上是关于PL/SQL 比较 XMLTypes的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 如何比较触发器中的表达式?

用 Pl/SQL 与 Java 编写的存储过程的性能比较

PL/SQL中If条件中的字符串比较

如何在 Oracle PL/SQL 中编写此数据库比较?

Oracle PL SQL:比较两个存储过程返回的引用游标结果

pl/sql developer和sql developer有啥区别?