2016-12-29 44 views
-1

我想,當我在HIRE使用觸發器添加新行更新來自CAR CAR_CASEUPDATE ROWNUM

create or replace TRIGGER HIRE_CAR_CASE_UPDATE 
AFTER INSERT OR UPDATE OF CAR_ID ON HIRE 
REFERENCING OLD AS OLD NEW AS NEW 

BEGIN 
UPDATE CAR SET CAR_CASE = 
(SELECT HIRE.CAR_CASE FROM HIRE where HIRE.CAR_ID = CAR.CAR_ID and TO_DATE (HIRE.DATE_) = TO_DATE(sysdate)) 
WHERE rowid = :NEW.ROWID; 

END; 
+2

觸發器在'HIRE'表上。你不能找到更新的CAR表的任何行:NEW.ROWID – GurV

+1

'WHERE rowid =:NEW.ROWID;'..這種情況永遠不會成功。 – XING

+1

澄清@XING語句:'WHERE rowid =:NEW.ROWID'表示WHERE CAR.rowid =:NEW.ROWID(HIRE)' - 實際上這永遠不會成功。一個ROWID永遠不能匹配多個表。 –

回答

4

看來,你想要做的是

CREATE OR REPLACE TRIGGER HIRE_CAR_CASE_UPDATE 
    AFTER INSERT OR UPDATE OF CAR_ID ON HIRE 
    FOR EACH ROW 
BEGIN 
    UPDATE CAR c 
    SET c.CAR_CASE = :NEW.CAR_CASE 
    WHERE c.CAR_ID = :NEW.CAR_ID; 
END HIRE_CAR_CASE_UPDATE; 

因爲我不知道你的數據庫是什麼樣的或者它是如何使用的我不能說是否應該對OLD.CAR_ID引用的「舊」CAR進行類似的更新。

但是,也許更重要的是 - 這是業務邏輯,真的不應該在觸發器中實現。把這種邏輯放在你的應用程序中,或者把它放到一個存儲過程中,該存儲過程爲特定的業務任務執行所有必要的邏輯,而不是在一堆觸發器,過程,單個SQL語句等中散佈邏輯。

祝你好運。

+0

或者,爲什麼麻煩使用觸發器呢?只需使用兩個表格查詢'car_case'。 –