0

在用户通过在线应用程序更新 ADDRESS 表后,我编写了一些触发器来自动更改 ESTABLISHMENT 表中 state_id 字段中的值。问题是,当用户更新 tble 地址中的 OTHER_STATE_ID = 16 和 POSTAL_STATE_ID = 16 时,表 ESTABLISHMENT 中的 OTHER_STATE_ID 的值仍然带有旧值。仅使用新值更新了 POSTAL_STATE_ID 字段。我检查了触发代码,没有发现任何奇怪的代码。似乎触发器保留了更新 other_state_id 的旧值。以下是数据场景:-

  1. 更新前(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
  2. 更新后的值(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;
4

0 回答 0