使用if条件触发更新

时间:2016-10-31 09:17:07

标签: if-statement oracle11g triggers

create or replace
TRIGGER TR_SITECONTACT_UPDATE
AFTER  UPDATE OR INSERT  ON s_ct 
FOR EACH ROW
DECLARE
v_SID s_ct.sid%type;
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN   
IF :NEW.CTID != :OLD.CTID THEN
      UPDATE CT
      SET lastupdatedon =sysdate,
        LASTUPDATESITE=:NEW.SID
      WHERE CTID  = :NEW.CTID;
COMMIT;
END IF;
END;

这里可以检查lastupdatedCOF是否为null然后使用update语句,在更新行之前我需要在CT表中检查lastupdatedCOF IS NULL或NOT。如果Null意味着我需要使用以下更新声明

UPDATE CT
      SET lastupdatedon =sysdate,
        LASTUPDATESITE=:NEW.SID
      WHERE CTID  = :NEW.CTID;
COMMIT;

lastupdatedCOF IS NOT NULL意味着

UPDATE CT
      SET lastupdatedon =sysdate,
        LASTUPDATESITE=:NEW.SID,
        lastupdatedCOF = NULL
      WHERE CTID  = :NEW.CTID;
COMMIT;

1 个答案:

答案 0 :(得分:0)

如果我读了你的问题,lastupdatedCOF为null(在这种情况下,它保持为null)或lastupdated_cof不为null,你想将它设置为null。

那么,为什么不总是将它设置为null?

即:

create or replace
TRIGGER TR_SITECONTACT_UPDATE
AFTER  UPDATE OR INSERT  ON s_ct 
FOR EACH ROW
DECLARE
v_SID s_ct.sid%type;
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN   
IF :NEW.CTID != :OLD.CTID THEN
      UPDATE CT
      SET lastupdatedon =sysdate,
        LASTUPDATESITE=:NEW.SID,
        lastupdatedCOF = NULL
      WHERE CTID  = :NEW.CTID;
COMMIT;
END IF;
END;

还有一点 - 你真的需要一个自主交易吗?如果插入/更新s_ct表的事务被回滚 - 如果事实如此,你将在CT表中留下一行已被更改的行,尽管没有发生根本的改变。