我有一些参数化表,需要在其中通过两列VALID_FROM和VALID_TO添加历史记录版本。在插入行之前,我有两个先决条件:
1)表中的每条记录在VALID_TO列中获得新值(sysday-1)
2)如果表中存在一些与sysdate(DD.MM.YYYY)具有相同日期的记录,则必须将其删除。
在插入行之前的表
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
这两个步骤应该在插入新行之前完成,并且应该是自动的。这是我收到的任务的任务。我无法更改。
我尝试在插入触发器之前创建带有全局临时表的触发器,以避免ora突变错误,但是它不起作用,因为删除了每个插入的行,并且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;
是否可以使用触发器解决此问题?如果是,有人可以帮我吗?
答案 0 :(得分:0)
您的代码看起来不错,只需执行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
。
答案 1 :(得分:0)
无法通过TRIGGER触发。