使用触发器在新行上设置列

时间:2015-09-25 11:20:52

标签: oracle plsql triggers

我有一个表名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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您正在尝试插入另一行,这也会重新触发触发器。

在触发器中,您可以使用变量:NEW:OLD访问该行。

如果您插入,:OLD为空,因为您尚未在表格中使用它。

因此,在插入行之前,请更新他的列:

:NEW.END_DATE = SYSDATE+30;