Как создать что-то, чтобы обновить дату окончания, автоматически начав столбец день и продолжительность SQL - PullRequest
0 голосов
/ 25 июня 2018

Я хочу создать что-то, что будет автоматически обновлять мои данные в таблице, но я не знаю, что использовать.

У меня есть таблица 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, потому что я хочу получить его автоматически после вставки или обновления некоторых строк).Возможно ли при вставке данных в таблицу само заполнить недостающие столбцы?

1 Ответ

0 голосов
/ 25 июня 2018

Ваш триггер должен перед обновлением , чтобы изменить значение в строке, по которой триггер срабатывает снова; и он должен изменить псевдокорд текущей строки * (новый) с помощью оператора присваивания - вам не следует выдавать отдельный оператор обновления внутри триггера. Для начала он будет каскадным, и в вашем примере woudl попытается обновить каждую строку в таблице. Но это также вызывает ошибку изменяющейся таблицы - вы пытаетесь обновить строки в таблице, против которой выступает триггер. Есть обходные пути, когда это действительно необходимо, но это не так, этого обновления просто не должно быть.

Так вы бы сделали:

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

Дата окончания всегда отражает значения двух других столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...