a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 179|回复: 0

[综合] OracleRMAN快速入门指南:ora-01779错误的解决

[复制链接]
发表于 2012-8-4 13:54:49 | 显示全部楼层 |阅读模式
在对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的键的判定。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-3 03:37 , Processed in 0.254518 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表