在对update进行优化时,考虑到update from 效率比较高,但由于oracle会对键值进行检查,导致报ora-01779错误,通过采用BYPASS_UJVC跳过Oracle的键的判定,达到同样的效果。 k3 y; L4 u+ @1 |
' v% O! X9 _1 `
例子如下:8 z, c4 Y6 ~4 H, D+ t! D2 L
3 S. t8 |9 b2 C
update (select /*+ BYPASS_UJVC */" y1 J: H3 E' D/ q( x1 O
+ {0 O3 }) _0 X& ~2 m8 z
t1.drawref,8 m0 ~2 ~0 h* @5 ^% M5 |
: }" J2 w" \ Z* | t.oprtype,
+ t j1 ]/ `& d+ k' p# c! K' W
: @9 n/ a$ D! k0 C6 y9 d t.bl_validation,) b1 M( ^: F& e2 k0 G
' Z7 J5 ?9 S$ `+ m3 O4 ~, M% V- v( h
'F' bl_validation_new,
6 Q V$ b0 h# T; C
1 O; B# H% U$ \ t.bl_msg,
6 u7 x2 l9 F/ h9 }" J
& O8 f3 s0 {( H0 s t.bl_msg ||
, u* P' K# o. O" O8 `
$ t9 B9 ?" B* s m. z case when (t1.drawref is null and t.oprtype = 'U') then '交易帐户编号不存在,不能更新;'* u+ ]; u5 U7 i+ [0 a; C
: T/ l$ |: c3 g! _
when (t1.drawref is null and t.oprtype = 'D') then '交易帐户编号不存在,不能删除;', }& g4 K- q& D8 L4 |' X
. \- v o6 }6 k! a1 o& g+ \
when (t1.drawref is not null and t.oprtype = 'I') then '交易帐户编号已存在,不能插入;'- c3 @) U. I. D) l
' E: ^ E/ m' u
end bl_msg_new3 p0 y( m7 q; r$ |& |4 z" O4 Z
" J4 h; C3 d* Y7 G from s_bl2_con_pro_temp t) \ |# `8 z! C$ H
# C1 l. n+ \' Z( }/ i' m4 L3 j left join s_bl2_con_pro t1
l5 @) _6 @. T
8 q1 k5 R% w0 z8 V3 h9 f on t.drawref = t1.drawref
! _ C6 g7 t$ J" u! ~. L( E/ z 3 L: }8 ?. l) ?' U" n
where
$ D7 Q' F3 p" v, @4 q
: Z; U. ~% q* J) S$ n --t.bl_user =134; |' y$ T7 m, n
) h* [# P O& U" ?: L
(t.OPRTYPE 'N' OR t.OPRTYPE is null)& j' ^0 O4 Q* p) P
' S% V2 Z' D( ^: m/ w and t1.BL_DELETED(+) = 'F'
- z! s q4 `0 }$ f8 c( O$ ` $ D; ~8 x0 Y- t! M3 h
and t1.OPRTYPE(+) in ('U','D','I')7 O/ D3 U8 r) r* H! X# j( e: e
9 h0 y* S6 h! C2 C+ g0 m3 d and t1.partition_key(+) = '201202290000'
0 R) E1 ?8 j7 Z
3 s( z) B4 M7 c# r7 @ and t.partition_key = '201202290000'
! ]1 E& l2 u; b; ^5 u8 y 8 k# r% l+ w" |: t2 W" n
)
: J. |9 `, o1 q7 o- h
: s" N1 ^0 o1 Y/ T" K H1 s& c set bl_validation = bl_validation_new,
$ d# ~; S# e4 ^+ _+ ]
4 Y: V$ _( m6 k6 ?8 M bl_msg = bl_msg_new. N4 N! _& }) W& A+ }
5 M9 G2 M4 I. l6 T+ n9 c; d! { ; j3 J! J& l7 P$ P: S
+ ^5 c2 r2 m) x! m4 m
commit;
6 S, b# D% ]" W9 B) }3 G+ o0 c
- J4 _3 X+ h! }. |" t1 K: Z 具体说明如下:& `( r0 G6 V# W
5 ~' C7 I6 S9 i' w2 P4 X' u9 f S
在我们肯定当前条件能确定记录唯一,又不是主键的时候,可以采用两种方法处理。& \ y \+ ~' A: K
: F2 ~8 D1 U, X; q! X3 G B/ p5 Y0 d. s
1、创建唯一性索引1 Q9 f( v' R; g5 w N# m# \
3 g- O# x; c5 c, ]7 [6 L" p
2、update ( select /*+ BYPASS_UJVC */ a.cola va,b.colb vb from a,b where a.id=b.id) set va=vb
5 q+ ]' v% U9 ]2 {6 t' S! @1 \ I * ?* H/ n( |9 ]4 V
BYPASS_UJVC的作用是跳过Oracle的键的判定。 |