两个基于相同子查询的DML

时间:2014-03-21 19:20:13

标签: oracle jdbc

我需要取消一些订单,然后在另一个表中插入一行,两者都基于相同的子查询。

子查询在第一个和第二个DML发布之间返回不同行的可能性非常小。

但有没有一种正确的方法来执行此操作,以便更新的订单与插入取消表中的订单相同?

我正在使用Oracle和JDBC。感谢。

update orders
set status = 'cancel'
where order_number in (select order_number from some_other_table_where...)


insert into order_cancellations
 select order_number select order_number from some_other_table_where...

1 个答案:

答案 0 :(得分:1)

以下是我想到的五种方法:

(1)在orders表格上设置一个触发器,这样只要status设置为'cancel',就会在order_cancellations中插入一行。

(2)使用insert中的return子句。首先执行插入并使用此信息进行更新。

(3)将创建日期添加到order_cancellations并首先插入。然后使用刚刚插入的行

更新orders

(4)将两个语句包装在一个事务中(这可能需要锁定其他表)。

(5)将子查询数据加载到临时表中,并将该表用于两个操作。

我也想知道你是否可以通过cancellation_date表中的orders列来消除对取消表的需要。