在用户通过在线应用程序更新 ADDRESS 表后,我编写了一些触发器来自动更改 ESTABLISHMENT 表中 state_id 字段中的值。问题是,当用户更新 tble 地址中的 OTHER_STATE_ID = 16 和 POSTAL_STATE_ID = 16 时,表 ESTABLISHMENT 中的 OTHER_STATE_ID 的值仍然带有旧值。仅使用新值更新了 POSTAL_STATE_ID 字段。我检查了触发代码,没有发现任何奇怪的代码。似乎触发器保留了更新 other_state_id 的旧值。以下是数据场景:-
更新前(ADDRESS 表)
- 对于 ADDRESS_TYPE = 1,值 LOCATION_STATE_ID = 8
- 对于 ADDRESS_TYPE = 2,值 POSTAL_STATE_ID = 8
- 对于 ADDRESS_TYPE = 11,值 OTHER_STATE_ID = 8
触发前(ESTABLISHMENT 表)
- 值 LOCATION_STATE_ID = 8
- 值 POSTAL_STATE_ID = 8
- 值 OTHER_STATE_ID = 8
更新后的值(ADDRESS 表)
- 用户更新值 LOCATION_STATE_ID = 8
- 对于 ADDRESS_TYPE = 2,值 POSTAL_STATE_ID = 16
- 对于 ADDRESS_TYPE = 11,值 OTHER_STATE_ID = 16
触发后(ESTABLISHMENT 表)
- 值 LOCATION_STATE_ID = 8
- 值 POSTAL_STATE_ID = 16
- 值 OTHER_STATE_ID = 8
也许在这行代码中发生了一些奇怪的事情。任何人..?
完整代码如下
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;