小编典典

在Oracle中使用触发器更改日期时出现问题

sql

我想创建一个可以在表“合同”中修改或插入日期的触发器:

“如果具有当前合同的客户签订了新合同,则前一个合同的结束日期将是新合同开始日期的前一天”

因此,我的 触发条件 是:

CREATE OR REPLACE TRIGGER TRIGGER_D
BEFORE
INSERT OR UPDATE ON CONTRACTS
FOR EACH ROW
DECLARE
idcliente CONTRACTS.CLIENTID%TYPE;
fecha_fin CONTRACTS.ENDDATE%TYPE;
BEGIN
  if :NEW.CLIENTID = idcliente  
    then 
    if TO_CHAR(fecha_fin) IS NULL OR TO_CHAR(fecha_fin) > TO_CHAR(:NEW.STARTDATE)
      then
        INSERT INTO CONTRACTS (ENDDATE) VALUES 
        (:NEW.STARTDATE);
        update CONTRACTS
        set
          ENDDATE = :NEW.STARTDATE;
    end if;      
  end if;
END;

我试图插入这样的行:

INSERT INTO CONTRACTS (CONTRACTID, CLIENTID, STARTDATE, ENDDATE, CONTRACT_TYPE ,ADDRESS ,TOWN, ZIPCODE, COUNTRY)
VALUES              ('TW42260/09','99/98480296/22T',TO_DATE('18/04/17','DD/MM/YY'), NULL ,'Flat Rate Lover','69 Citadel Street, Ground floor, door 1','Summer forest', '11164' ,'Taiwan, Province of China');

该触发器可以很好地编译,但是他们在桌上没有做任何事情。


阅读 209

收藏
2021-04-14

共1个答案

小编典典

您想要这样的东西:

CREATE OR REPLACE TRIGGER TRIGGER_D
BEFORE
INSERT OR UPDATE ON CONTRACTS
FOR EACH ROW
DECLARE
BEGIN
  UPDATE CONTRACTS
  SET    ENDDATE   = :NEW.STARTDATE - INTERVAL '1' DAY
  WHERE  CLIENTID  = :NEW.CLIENTID
  AND    ENDDATE   > :NEW.STARTDATE
  AND    STARTDATE < :NEW.STARTDATE;
END;

但是,它正在更新触发器正在监视的表,并且该触发器似乎将导致更新,该更新将再次调用该触发器并得到一个突变表错误。

您最好将业务逻辑包装在存储过程中,在该存储过程中可以对前几行执行更新,然后执行插入/更新。然后,与其直接在表上执行DML语句,不如调用存储过程。

2021-04-14