关注ORACLE ERP及开发工具 引用本人原创文章敬请注明出处

变异表问题

上一篇 / 下一篇  2007-03-02 00:00:00 / 个人分类:Oracle 开发

有个需求,需要在基于A表的行级TRIGGER中更新B表某字段前先检查A表其他记录数,这会遇到变异表问题,由于更新A后又会触发更新B表,就在B表中执行上面的检查操作,结果发现多数情况可以执行过去,但少部分情况还是会有变异表问题发生,但重新操作又可以过,看起来这种方式有不确定性。环境为10g的DB.

解决的方法

1、按TOM提供的方式,在包中加公共变量,然后用表级trigger获取值,在行级trigger判断

2、用自治事务隔离操作。本例中采用后者较简单。在B表的行级before update中写一自治事务函数:

IF ... THENITPUB个人空间u!hab'y\9H
DECLARE
4C;LN`1?E!q0FUNCTION get_max_date(p_branch_no2 VARCHAR2) RETURN VARCHAR2 IS
7@q"VwU-X*y#Z-L0PRAGMA AUTONOMOUS_TRANSACTION;
C!P]iCb0v_end_date varchar2

BEGIN

......ITPUB个人空间dPk9\$L)Bw
ITPUB个人空间;mZ+vN Q U#K
IF ... THEN
/h/}*~r.tgjSW0RETURN(v_end_date);ITPUB个人空间Tyb.QgQ1z
ELSE
\e2`&lv I8_9v@0RETURN(p_end_date);
-^*K.m&I-f5ah(u3g1sc ]0END IF; ITPUB个人空间P|8pNhx Is ?
END;
^ c MOOE T0BEGIN
'rY3iDo0:NEW.end_date := get_max_date(:NEW.branch_no2);ITPUB个人空间+{j%jt)|8H"fsy^%O|
END;ITPUB个人空间*k3^ a5f;M$HOk
END IF;


c%X6kj.^\'W.D0

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar