使用Oracle DB,可以更新一个表并删除(匹配行)吗?
我尝试了各种形式的MERGE
,但我得到了:
ORA-01446:无法从DISTINCT,GROUP BY等视图中选择ROWID或采样
(可能由视图中的UNION ALL
引起)
或
ORA-38106:使用INSTEAD OF触发器在连接视图或视图中不支持MERGE。
这个(“连接视图”)表明,以MERGE
方式指定任何形式的两个表都是不行的。这是对的吗?
(使用单一陈述的原因是:性能,一致性和清晰度)
我的Oracle DB版本为11.2。
实际问题是这样的:
我们(图书馆)有书籍的(父)表和内容的(子)表(每本书一个或零,它有一个FK到书籍表)。每年我们都会为每本超过10年的书(我们简化条件,因为它与这里的问题无关)运行一个工作,我们在书中设置一个名为RETIRED的列为“YES” em> table并删除 content 表中的行(如果存在)。
PS:欢迎使用PL / SQL解决方案。 (无论如何,我的代码都在PL / SQL中)
答案 0 :(得分:1)
将一个事务与两个语句一起使用:
content
以退休; DECLARE
TYPE id_list IS TABLE OF books.id%TYPE;
retired_list id_list;
BEGIN
UPDATE books
SET retired = 'YES'
WHERE publish_date <= add_months(TRUNC(SYSDATE), -120)
RETURNING id BULK COLLECT INTO retired_list;
FORALL id IN retired_list.FIRST .. retired_list.LAST
DELETE content
WHERE book_id = retired_list(id);
COMMIT;
END;
/
。PL / SQL解决方案可能是:
{{isPossible}}