回答

收藏

ORA-38104:ON子句中引用的列无法更新

技术问答 技术问答 190 人阅读 | 0 人回复 | 2023-09-14

我有一个带有删除标志的简单表(记录应在此列中更新,而不是删除):$ x) g# O+ c6 _
create table PSEUDODELETETABLE
- l: u6 s, I2 l(. O4 J6 t( e& b3 e# ]4 @3 |
  ID        NUMBER(8) not null, -- PKEY7 r! ~0 w+ D3 ^, M
  NAME      VARCHAR2(50) not null,; E& j( ^/ G+ F) @
  ISDELETED NUMBER(1) default 0 not null
3 l; n! d; s1 u3 F: y)
, M( G& }* A3 m) i) m插入新记录时,我必须检查是否已存在与主键匹配但ISDELETED =
* Z+ J) t) I$ n) I) g1的记录。在这种情况下,我必须将ISDELETED更改为0并更新其他列。因此,我正在使用以下Merge-Statement:
' K& S6 z1 v- |( H/ Y0 tmerge into ET.PSEUDODELETETABLE TARGET9 V2 u5 `7 b7 r0 z
using (select 1 as ID, 'Horst' as NAME from sys.dual) SOURCE
6 |6 P4 Y- D6 t* D- yon (TARGET.ISDELETED = 1 and SOURCE.ID = TARGET.ID)
; V& k# D( P/ r6 Lwhen matched then
0 [4 c0 X$ Q3 ?8 o: V/ P# @$ t  update set ISDELETED = 0, NAME = SOURCE.NAME. X9 K' R$ u# f$ R6 y! K
when not matched then6 W( u/ p, |! |  H
  insert values (SOURCE.ID, SOURCE.NAME, 0);
/ E1 l5 G7 E, Z. `6 I* F在Sql Server上,它运行良好,但是Oracle表示:
! C, I& }5 ~5 `; p; h: H3 dORA-38104: Columns referenced in the ON Clause cannot be updated: TARGET.ISDELETED6 }1 ~0 ^5 f4 v+ \
如果存在IDELETED = 0的匹配记录,我希望将主键冲突作为例外,这就是为什么我不能将“ TARGET.ISDELETED =
. l' n/ V. C8 B0 P1”从从句移动到更新语句的原因。& a) G# N; @& U8 N+ V% h- o( k
               
$ ~! @: |2 O1 x( L5 f6 x! f解决方案:
( e! U' B4 L) q. Y0 |! @                ! g! A0 l% ]7 V9 N6 A' z' E2 D7 {  z

  Y) D$ I4 P9 _. V
! z/ _1 x0 V2 `! y                在这种情况下,我怀疑您最好使用“先看后看”算法。, t( k5 _/ h3 H+ b! v+ D) J
根据您期望的更为常见的情况,可以执行以下任一操作:
: N4 M% }" P- D1 y更新,如果没有行被更新,则插入;或者9 }' ^( @7 H, {9 L+ R$ ~. R7 A
插入,如果有按键冲突,请更新。
1 e( Q4 e2 W' k" a( V. Q( |) K
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则