如何通过自动SQL的开始日期和持续时间列来创建更新结束日期的内容



我想创建一些东西来自动更新表中的数据,但我不知道该用什么。

我有NR1表

create table NR1
(
id         INTEGER not null,
price      INTEGER,
price2     INTEGER,
start_date DATE,
end_date   DATE,
duration   NUMBER
)

我试图创建触发器,该触发器将在插入或更新我的表后始终更新,end_date,所以我尝试了这样的事情:

create or replace trigger update_nr1_date
after update or insert on nr1
for each row
when (new.id>0)
declare
begin
UPDATE nr1
set nr1.end_date =add_months(nr1.start_date, nr1.duration);
end;

但是它有突变问题,我读了一些关于它的东西,我理解了这个概念。我想像这样制作触发器(不是 sheduler,因为我想在插入或更新某些行后自动获取它(。是否可以在将数据插入表格时重新填充缺少的列?

您的触发器需要在更新之前更改再次触发触发器的行中的值;并且它需要通过赋值语句修改当前行的(新(伪记录 - 您不应该在触发器内发布单独的更新语句。首先,它将级联,在您的示例中将尝试更新表中的每一行。但这也会导致更改表错误 - 您正在尝试更新触发器所针对的表中的行。当实际需要时,有一些解决方法,但它不在这里,更新不应该在那里。

所以你会做:

create or replace trigger update_nr1_date
before update or insert on nr1
for each row
when (new.id>0)
begin
:new.end_date := add_months(:new.start_date, :new.duration);
end;
/

但是,如果您使用的是 11g 或更高,则可以改用虚拟列,而无需触发器:

create table NR1
(
id         INTEGER not null,
price      INTEGER,
price2     INTEGER,
start_date DATE,
end_date   DATE generated always as (add_months(start_date, duration)) virtual,
duration   NUMBER
)

然后,当您插入时,跳过语句中的该列:

insert into nr1 (id, price, price2, start_date, duration)
values (1, 2, 3, date '2018-06-01', 3);
1 row inserted.
select * from nr1 where id = 1;
ID      PRICE     PRICE2 START_DATE END_DATE     DURATION
---------- ---------- ---------- ---------- ---------- ----------
1          2          3 2018-06-01 2018-09-01          3

结束日期始终反映其他两列的值。

最新更新