我想创建一个可以在表“合同”中修改或插入日期的触发器:
“如果具有当前合同的客户签订了新合同,则前一个合同的结束日期将是新合同开始日期的前一天”
因此,我的 触发条件 是:
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');
该触发器可以很好地编译,但是他们在桌上没有做任何事情。
您想要这样的东西:
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语句,不如调用存储过程。