首页 > 解决方案 > 在触发器之前运行一次以插入多行 PL/SQL

问题描述


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

这两个步骤应该在插入新行之前完成,并且应该是自动的。这是我收到的任务的分配。我不能改变它。

我尝试使用全局临时表创建 before insert 触发器以避免 or 变异错误,但它不起作用,因为每个插入的行都被删除并且 VALID_FROM 和 VALID to 列中的日期也不正确。所以我只需要检查一次表中的旧记录,然后插入所有行而不检查

我的代码:

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;

有可能用触发器解决这个问题吗?如果是,有人可以帮助我吗?

标签: sqloracleplsqltriggers

解决方案


不可能通过TRIGGER。


推荐阅读