一尘不染

使用插入选择复制记录,然后更新同一组记录中的属性

sql

我有一个Oracle过程,在该过程中我想执行以下操作:

  1. 将记录从一个表复制到另一个表
  2. 更新原始记录以指示它们已被复制

目前 ,我正在使用FOR循环分别处理每个记录。这可行,但是做很多我认为可能更简单的代码。

我想要:

  1. 消除for循环并使用INSERT INTO … SELECT …语句复制记录
  2. 如果复制成功,则更新所有选定的记录。

这看起来很简单,只有一个INSERT和一个具有相同WHERE子句的UPDATE语句。但是,在执行这两个语句之间的时间中,可能会插入更多需要复制的记录。如果我使用相同的WHERE子句,则可能会将记录标记为已处理,但实际上尚未处理。

有没有一种方法可以保存主键列表以在两个语句中使用或合并语句?还是您会建议我坚持使用FOR循环并一次处理一个记录?欢迎所有建设性意见。


阅读 131

收藏
2021-05-16

共1个答案

一尘不染

如果您运行这两个语句 within a transaction ,则任何失败都将导致插入和更新都被回滚。

insert into tgt..
select * from src
where <condition>
  and row_status <> 'copied'; --ignoring records after they have been copied once?

update src
set row_status = 'copied'
where <same_where_condition_as_before>

commit;

如果读取后在源表中插入了新行,则可能需要再次运行该块,并在适当的地方更改条件。

2021-05-16