Oracle触发器仍为新触发器保留旧值

Oracle触发器仍为新触发器保留旧值,oracle,plsql,triggers,Oracle,Plsql,Triggers,在用户通过在线应用程序更新地址表后,我编写了一些触发器来自动更改建立表中state_id字段的值。问题是,当用户更新tble地址中的OTHER_STATE_ID=16和POSTAL_STATE_ID=16时,表建立中OTHER_STATE_ID的值仍然携带旧值。只有邮政_STATE_ID字段用新值更新。我已经检查了触发代码,没有发现任何奇怪的代码。触发器似乎保留旧值以更新其他\u状态\u id。以下是数据场景:- 更新前(地址表) 对于地址类型=1,值位置状态ID=8 对于地址类型=2,值为邮

在用户通过在线应用程序更新地址表后,我编写了一些触发器来自动更改建立表中state_id字段的值。问题是,当用户更新tble地址中的OTHER_STATE_ID=16和POSTAL_STATE_ID=16时,表建立中OTHER_STATE_ID的值仍然携带旧值。只有邮政_STATE_ID字段用新值更新。我已经检查了触发代码,没有发现任何奇怪的代码。触发器似乎保留旧值以更新其他\u状态\u id。以下是数据场景:-

  • 更新前(地址表)

    • 对于地址类型=1,值位置状态ID=8
    • 对于地址类型=2,值为邮政状态ID=8
    • 对于地址类型=11,值其他状态ID=8
    触发前(建立表)

    • 值位置\状态\ ID=8
    • value POSTAL_STATE_ID=8
    • 值其他状态ID=8
  • 更新后的值(地址表)

    • 用户更新值位置\状态\ ID=8
    • 对于地址类型=2,值为邮政状态ID=16
    • 对于地址类型=11,值其他状态ID=16
    触发后(建立表)

    • 值位置\状态\ ID=8
    • value POSTAL_STATE_ID=16
    • 值其他状态ID=8
  • 也许在这一行代码中发生了一些奇怪的事情。有人

    完整代码如下所示

    创建或替换
    触发“TR_ADDRESS_EE”
    插入或更新后
    住址
    每行
    开始
    如果插入
    然后
    如果(:NEW.STATE_ID不为空)
    然后
    如果(:NEW.RECORD\u TYPE\u ID=401)
    然后
    如果(:NEW.ADDRESS_TYPE=1)
    然后
    更新编制
    设置位置\u状态\u ID=:NEW.STATE\u ID
    其中,机构\u ID=:NEW.RECORD\u ID;
    ELSIF(:NEW.ADDRESS_TYPE=2)
    然后
    更新编制
    设置邮政_状态_ID=:NEW.STATE_ID
    其中,机构\u ID=:NEW.RECORD\u ID;
    ELSIF(:NEW.ADDRESS_TYPE=11)
    然后
    更新编制
    设置其他_状态_ID=:NEW.STATE_ID
    其中,机构\u ID=:NEW.RECORD\u ID;
    如果结束;
    如果结束;
    如果结束;
    ELSIF更新('STATE_ID'))
    然后
    IF(:OLD.RECORD\u TYPE\u ID=401和:NEW.STATE\u ID:OLD.STATE\u ID)
    然后
    如果(:NEW.ADDRESS_TYPE=1)
    然后
    更新编制
    设置位置\u状态\u ID=:NEW.STATE\u ID
    其中,机构\u ID=:OLD.RECORD\u ID;
    ELSIF(:NEW.ADDRESS_TYPE=2)
    然后
    更新编制
    设置邮政_状态_ID=:NEW.STATE_ID
    其中,机构\u ID=:OLD.RECORD\u ID;
    ELSIF(:NEW.ADDRESS_TYPE=11)
    然后
    更新编制
    设置其他_状态_ID=:NEW.STATE_ID
    其中,机构\u ID=:OLD.RECORD\u ID;
    如果结束;
    如果结束;
    如果结束;
    结束;
    

    . 也许您需要(通过编辑问题,而不是作为注释)显示您的表创建语句以及所有insert和update语句,以查看它们的不同之处,因为我必须编写这些语句。不过,我不建议尝试通过触发器维护重复数据;为什么不在
    地址
    上查看
    建立
    ?目的是通过触发器维护重复数据,因为地址表由不同的模块使用。所以机构应该有从各种来源更新的最新状态id,你确定没有其他触发器更新机构表吗?是的。我放下并重新创建触发器。有时它会显示正确的结果。但过了一会儿,错误又回来了。我需要再修一次扳机吗?
        create or replace
    TRIGGER "TR_ADDRESS_EE"
       AFTER INSERT OR UPDATE
       ON ADDRESS
       FOR EACH ROW
    BEGIN
       IF INSERTING
       THEN
          IF (:NEW.STATE_ID IS NOT NULL)
          THEN
             IF (:NEW.RECORD_TYPE_ID = 401)
             THEN
                IF (:NEW.ADDRESS_TYPE = 1)
                THEN
                   UPDATE ESTABLISHMENT
                      SET LOCATION_STATE_ID = :NEW.STATE_ID
                    WHERE ESTABLISHMENT_ID = :NEW.RECORD_ID;
                ELSIF (:NEW.ADDRESS_TYPE = 2)
                THEN
                   UPDATE ESTABLISHMENT
                      SET POSTAL_STATE_ID = :NEW.STATE_ID
                    WHERE ESTABLISHMENT_ID = :NEW.RECORD_ID;
                ELSIF (:NEW.ADDRESS_TYPE = 11)
                THEN
                   UPDATE ESTABLISHMENT
                      SET OTHER_STATE_ID = :NEW.STATE_ID
                    WHERE ESTABLISHMENT_ID = :NEW.RECORD_ID;
                END IF;
             END IF;
          END IF;
       ELSIF UPDATING ('STATE_ID')
       THEN
          IF (:OLD.RECORD_TYPE_ID = 401 AND :NEW.STATE_ID <> :OLD.STATE_ID)
          THEN
             IF (:NEW.ADDRESS_TYPE = 1)
             THEN
                UPDATE ESTABLISHMENT
                   SET LOCATION_STATE_ID = :NEW.STATE_ID
                 WHERE ESTABLISHMENT_ID = :OLD.RECORD_ID;
             ELSIF (:NEW.ADDRESS_TYPE = 2)
             THEN
                UPDATE ESTABLISHMENT
                   SET POSTAL_STATE_ID = :NEW.STATE_ID
                 WHERE ESTABLISHMENT_ID = :OLD.RECORD_ID;
             ELSIF (:NEW.ADDRESS_TYPE = 11)
             THEN
                UPDATE ESTABLISHMENT
                   SET OTHER_STATE_ID = :NEW.STATE_ID
                 WHERE ESTABLISHMENT_ID = :OLD.RECORD_ID;
             END IF;
          END IF;
       END IF;
    END;