2017-04-18 85 views
0

我想創建一個觸發器,它可以修改或者在我的表中插入日期「合同」:問題與觸發器更改日期在Oracle

「如果用目前的合同客戶簽訂一個新的結束日期 前一個將成爲新的」

所以開始日期的前一天,我觸發是:

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'); 

這個觸發器編譯得很好,但他們沒有在桌子上做任何事情。

+1

你沒有設置'idcliente',所以第一個比較永遠不會是真的(對於'fecha_fin'也是如此),所以觸發器什麼都不做。如果你在觸發器中插入/更新,它會再次觸發,所以你冒着遞歸的風險,並且更新會得到一個變異的表錯誤。你的任務是否需要你使用觸發器? –

+0

爲什麼比較「大於」的字符串? –

+0

這是大學的工作 –

回答

0

你想是這樣的:

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語句,而是調用存儲過程。

+0

非常感謝您,我只是在觸發器上放置了「插入」,並且突變表格消失了,因爲我沒有真正使用「更新」選項。非常感謝 :) –