回答

收藏

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

技术问答 技术问答 131 人阅读 | 0 人回复 | 2023-09-13

我有一个Oracle过程,在该过程中我想执行以下操作:, g& x7 d7 ]  e
[ol]将记录从一个表复制到另一个表/ p( A$ Z$ [+ C1 T( E& ?
更新原始记录以指示它们已被复制
5 d8 z, S' a! A, N  p* M: d[/ol]
, q% x3 B9 {( `" _4 J目前 ,我正在使用FOR循环分别处理每个记录。这可行,但是做很多我认为可能更简单的代码。
  S' G- E4 Q) B& r9 d/ g! K3 s我想要:$ G% u3 l9 F6 C# c2 ?
[ol]消除for循环并使用INSERT INTO … SELECT …语句复制记录
7 r+ G) q  w8 z7 T6 [9 q如果复制成功,则更新所有选定的记录。
$ k  I; T0 L$ F[/ol]9 _( B# x& B& D) T+ C& a% C- c, {7 ?
这看起来很简单,只有一个INSERT和一个具有相同WHERE子句的UPDATE语句。但是,在执行这两个语句之间的时间中,可能会插入更多需要复制的记录。如果我使用相同的WHERE子句,则可能会将记录标记为已处理,但实际上尚未处理。9 f7 V. j/ P) ]( W! k9 J7 b
有没有一种方法可以保存主键列表以在两个语句中使用或合并语句?还是您会建议我坚持使用FOR循环并一次处理一个记录?欢迎所有建设性意见。% ^0 a- i; m$ r0 r* o! `; M
                5 K" f) F$ a2 Q5 ?
解决方案:
6 u2 M; I3 f) J( ^: N8 D/ x                " r% y# O0 s* w. p4 K

* M: i( a& G( P* v# p1 S( s9 n& H9 E1 {4 y
                如果您运行这两个语句 within a transaction ,则任何失败都将导致插入和更新都被回滚。
+ b* g" o. u0 I, b$ t+ F/ r# E& Kinsert into tgt..' \0 c" l$ z3 ]  M
select * from src
( `+ l+ H6 M' b# kwhere 4 i8 {- `$ H7 o
  and row_status  'copied'; --ignoring records after they have been copied once?1 ]% [/ w0 m% |8 g4 S
update src5 t1 \, E( |/ j; J6 E* r
set row_status = 'copied'( Q1 ~9 Z+ s* z7 A3 T2 I' B  r& s
where
* E& [5 J" i! w* Dcommit;
3 e3 B; s9 ^6 Z. l. ]: m如果读取后在源表中插入了新行,则可能需要再次运行该块,并在适当的地方更改条件。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则