我需要取消一些订单,然后在另一个表中插入一行,两者都基于相同的子查询。
子查询在第一个和第二个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...
答案 0 :(得分:1)
以下是我想到的五种方法:
(1)在orders
表格上设置一个触发器,这样只要status
设置为'cancel'
,就会在order_cancellations
中插入一行。
(2)使用insert
中的return子句。首先执行插入并使用此信息进行更新。
(3)将创建日期添加到order_cancellations
并首先插入。然后使用刚刚插入的行
orders
(4)将两个语句包装在一个事务中(这可能需要锁定其他表)。
(5)将子查询数据加载到临时表中,并将该表用于两个操作。
我也想知道你是否可以通过cancellation_date
表中的orders
列来消除对取消表的需要。