怎么在Oracle里边写一个tigger ,这个trigger是在某个table更新完了触发的,而这个trigger会用到select 某个table的语句的cursor, 为了防止row changed between retrieve and update 这样的错误,我应该怎么写呢?

解决方案 »

  1.   

    怎么会出现row changed between retrieve and update 错误了?pb?
      

  2.   

    加大undo表空间和undo_retention参数
      

  3.   

    oracle 不会报这个 “row changed between retrieve and update ” 错误,按照自己的思路把触发器写出来,实验一下。
      

  4.   

    是这样子的,我有一个表假设叫
    table_1
    wo_no(key)
    wo_seq(key)
    wo_begin_date
    wo_end_date
    custom_1
    ...
    另一表是
    table_2
    wo_no
    wo_seq
    trx_no(key)
    dsp_seq(显示次序)
    resource_code现在有一个wo_no = 1 的记录连着3条table_2的数据, 现要在每次table_2的更新时,比如改变显示顺序,要把显示顺
    序最小的那个resource_code 写到table1 的custom_1里边.什么情况下才算是table_2所有记录都更新完了呢?因为如果在没有更新完的情况下,我要比较显顺序比较麻烦.比如当前顺序是1 2 3  , 现在把1,2调换位置, 更新的时候先把2更新成1了,在第二行更新前便有了两个显示顺序等于2的数据,但是我只能每一行都去比较,看哪个显示顺序最小.有什么解决方法吗?
      

  5.   

    CREATE OR REPLACE TRIGGER UAS_JM_WO_TRANSACTION
    AFTER UPDATE
    ON XYTO_TEST_14V.JM_WO_TRANSACTION
    REFERENCING NEW AS NEW OLD AS OLD
    BEGIN
      IF Pk_Trx_Trigger.TRIGGERSENABLED THEN
         IF NOT Pk_Trx_Trigger.F_EMPTYROWLIST(TRUE) THEN
            Pk_Trx_Trigger.P_HANDLE_UPDATE;
         END IF;
      END IF;
    END;
    /
    在P_HANDLE_UPDATE完了之后还不算整个UPDATA结束了吗?
      

  6.   

    按照我的理解:after update 触发器是在触发表更新完之后才开始执行触发器的内容,因此不存在“什么情况下才算是table_2所有记录都更新完了呢?”这个问题。以上仅仅是我的理解,没有经过实验,希望没有误导你。
      

  7.   

    按照这个描述,主要任务是找到最小的id,然后更新到table_1.custom_1中。