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


У меня есть несколько таблиц параметризации, где мне нужно добавить историю версии через два столбца VALID_FROM и VALID_TO. Перед вставкой строк у меня есть два предварительных условия:

1) каждая запись, находящаяся в таблице, получает новое значение в столбце VALID_TO (sysday - 1)
2) если в таблице существует несколько записей, дата которых совпадает с датой sysdate (ДД.ММ.ГГГГ), их необходимо удалить.

таблица перед вставкой строк

columnA VALID_FROM  VALID_TO
row1    1.1.2016    31.12.2999
row2    1.1.2016    31.12.2999
row3    3.1.2016    31.12.2999

таблица после вставки строк

columnA VALID_FROM  VALID_TO
row1    1.1.2016    24.6.2018
row2    1.1.2016    24.6.2018
row3    3.1.2016    24.6.2018
row1    25.6.2018   31.12.2999
row2    25.6.2018   31.12.2999
row3    25.6.2018   31.12.2999
row4    25.6.2018   31.12.2999

Эти два шага должны быть закончены перед вставкой новых строк и должны быть автоматическими. Это задание, которое я получил. Я не могу это изменить.

Я пытался создать перед вставкой триггер с глобальной временной таблицей, чтобы избежать ошибки мутации, но она не работает, потому что каждая вставленная строка удаляется, а даты в столбцах VALID_FROM и VALID тоже не корректны. Поэтому мне нужно проверять старые записи в таблице только один раз, а затем вставлять все строки без проверки

Мой код:

CREATE OR REPLACE TRIGGER CHANGE_DATE_PARM_TABLE_MUT2
 after INSERT on TMP_GR_PARM_IDP_IC_CUST
 FOR each ROW
 BEGIN
   --if exists record which have todas date, then delete
  delete from GR_PARM_IDP_IC_CUST1 where DT_VALID_FROM = get_sysdate;
  --change date in VALID_TO for old records
  update GR_PARM_IDP_IC_CUST1 a set
  DT_VALID_TO = TO_CHAR(SYSDATE - 1, 'DD.MM.YYYY')
  where DT_VALID_TO = '31.12.2999';
 --insert records from temporary table into normal parametrization table
  insert into GR_PARM_IDP_IC_CUST1 values (:new.RELATION, :new.DT_VALID_FROM, :new.DT_VALID_TO);
END;

Можно ли решить эту проблему с помощью триггера? Если да, может ли кто-нибудь мне помочь?

Ответы [ 2 ]

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

это невозможно через TRIGGER.

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

Ваш код выглядит нормально, просто выполните его BEFORE INSERT вместо AFTER INSERT. И я не понимаю, зачем вам глобальная временная таблица. Соответствует ли следующий триггер вашим требованиям?

CREATE OR REPLACE TRIGGER ti_mytable 
  BEFORE INSERT ON mytable FOR EACH ROW
BEGIN
  DELETE FROM mytable WHERE valid_from = TRUNC(SYSDATE);
  UPDATE mytable SET valid_to = TRUNC(SYSDATE - 1);
  :new.valid_from := TRUNC(SYSDATE);
  :new.valid_to := DATE '2999-12-31';
END ti_mytable;
/

SELECT * FROM mytable;
COLA  VALID_FROM   VALID_TO
1     01.01.2016   31.12.2999
2     01.01.2016   31.12.2999
3     03.01.2016   31.12.2999

INSERT INTO mytable (cola) VALUES (4);
1 row inserted.
SELECT * FROM mytable;
COLA  VALID_FROM   VALID_TO
1     01.01.2016   24.06.2018
2     01.01.2016   24.06.2018
3     03.01.2016   24.06.2018
4     25.06.2018   31.12.2999

Кроме того, я бы рекомендовал хранить даты всегда как тип данных DATE, а не как строку / тип данных VARCHAR2.

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