仅在触发之前运行一次以插入多行PL / SQL

时间:2018-06-25 07:28:49

标签: sql oracle plsql triggers


我有一些参数化表,需要在其中通过两列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;

是否可以使用触发器解决此问题?如果是,有人可以帮我吗?

2 个答案:

答案 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触发。