我有一个表名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 :(得分: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;