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的主要内容,如果未能解决你的问题,请参考以下文章