У меня есть несколько таблиц параметризации, где мне нужно добавить историю версии через два столбца 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;
Можно ли решить эту проблему с помощью триггера? Если да, может ли кто-нибудь мне помочь?