在多个表中的同一SQL中更新和删除?

时间:2016-06-07 22:24:05

标签: sql database oracle oracle11g

使用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中)

1 个答案:

答案 0 :(得分:1)

一个事务与两个语句一起使用:

  1. 更新content以退休;
  2. 删除所有已退役图书的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; /
  3. PL / SQL解决方案可能是:

    {{isPossible}}