2015-09-02 94 views
0

我需要更新「我的表LOG_ALARMA的,當我有一個INSTERUPDATE」領域DATAMARKERCONTADOR」。在oracle中觸發。 - 更新字段時插入或更新另一場

我有這個,但返回屏蔽錯誤。

create or replace TRIGGER TRIGGER2 
AFTER INSERT OR UPDATE OF CONTADOR ON LOG_ALARMA 
for each row 
BEGIN 
    UPDATE LOG_ALARMA a 
    SET a.DATAMARKER=(SYSDATE); 
END; 

我看看另一個例子,他們的工作,但我不能正確地執行這個。

如果我評論的每一行線在我的觸發器主體則工作正常,但它UPDATES表中的所有行。

+0

如果觸發器讀取一個表,它不能更改它讀取的表。這就是爲什麼你有突變錯誤。 – Buddi

+0

我想你試圖記錄更新記錄的時間。爲此,您不需要創建歷史記錄表並使用觸發器記錄更改。 – Buddi

+0

使用':new.datamarker:= sysdate';在** BEFORE **觸發器中。 –

回答

0

您不會發出更新SQL語句,因爲這會再次觸發觸發器。

相反,您只需使用PL/SQL而不是SQL將值:new.DATAMARKER設置爲sysdate。

使其成爲BEFORE INSERT或UPDATE也。存在於表

0
CREATE TABLE Mutating 
(
    ID1 NUMBER, 
    DATE1 DATE 
) 

數據

ID1 DATE1 
1 09/01/2015 14:09:14 
1 08/31/2015 14:09:21 
2 08/30/2015 14:09:30 

現在我想如果有更新發生在ID1列在那種情況下我已經使用觸發下面看更新日期1。

CREATE OR REPLACE TRIGGER Mutating_trg 
     before INSERT OR DELETE OR UPDATE ON Mutating 
    referencing old as old new as new 
     for each row 

     begin 

      if updating then 
      :new.date1:=sysdate; 
      end if; 

    end; 

的話,我已經發布更新語句

update set Mutating id1=6 where trunc(date1)=trunc(sysdate-2) 
    1 row updated 

現在看看結果

ID1 DATE1 
1 09/01/2015 14:09:14 
6 09/02/2015 14:09:14 
2 08/30/2015 14:09:30 

您語句之前應該使用。

+0

您不需要查詢就可以將sysdate分配給PL/SQL中的變量。 –

+0

我很喜歡你的評論,馬! –

+0

@a_horse_with_no_name是的,我知道不需要選擇語句。所以我已經更新了謝謝。 – Buddi