我想创建一个触发器,可以在我的表“合同”中修改或插入日期:
“如果当前合同的客户签订新合同,则前一个合同的结束日期将是新合同开始日期的前一天”
所以,我的触发器是:
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 语句,而是调用存储过程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句