2015-09-25 30 views
1

我有一個表名dblog在架構就像是上一個新行設置一列與觸發器

data_balance_id number(8) primary key, 
plan_id number(6) not null, 
start_date date default current_date, 
end_date date not null); 

所以我想創建一個觸發器,它會更新時,插入要enddate列發生。 enddate將從插入日起30天內更新。我的觸發代碼是

CREATE OR REPLACE TRIGGER trg 
BEFORE INSERT 
ON dblog FOR EACH ROW 

BEGIN 
    INSERT INTO dblog (end_date) values (SYSDATE()+30); 
END; 
/

插入查詢就像下面

insert into dblog (db_id, planid) values (12,123); 

沒有任何錯誤創建觸發器。但在插入時我得到以下錯誤

insert into dblog (db_id, planid) values (12,123) 
      * 
ERROR at line 1: 
ORA-00036: maximum number of recursive SQL levels (50) exceeded 
ORA-06512: at "E1038351.TRG1", line 2 
+0

要更新,因此不要插入另一行:剛纔設置的值:new.end_date –

+1

插入之前,你都做了並插入到相同的表,無限循環 –

回答

3

你只是想修改:new僞記錄。事情是這樣的

CREATE OR REPLACE TRIGGER trg 
    BEFORE INSERT ON dblog 
    FOR EACH ROW 
BEGIN 
    :new.end_date := sysdate + 30; 
END; 

如果你不想end_date有一個時間分量(或者說,你想要的時間成分是午夜),你會想trunc(sysdate) + 30

+0

它給錯誤「PLS-00049:壞綁定變量」NEW.END_DATE' ' –

+0

@ AnirbanNag'tintinmj' - 你確定你使用冒號前綴嗎?你在用什麼客戶?您的客戶端可能會嘗試使用':'前綴作爲綁定變量來解釋任何內容。 –

+0

對不起在打字時出錯。所有工作都很好。 –

0

您正試圖插入另一行,這也會重新觸發觸發器。

在觸發器中,您可以使用變量:NEW:OLD訪問該行。

如果您插入,:OLD爲空,因爲您尚未在表中包含它。

所以插入行之前更新他的專欄是這樣的:

:NEW.END_DATE = SYSDATE+30; 
相關問題