在Oracle中创建AFTER触发器以访问:new和:old变量

时间:2015-10-16 11:14:21

标签: oracle plsql oracle11g triggers mutating-table

我在包含两个日期列{8}和Start_DT的表格中遇到以下情况。

End_DT

每当我插入一个新行时,例如我想插入以下元组+----+------------+------------+ | ID | Start_DT | End_DT | +----+------------+------------+ | 1 | 01-01-2012 | 02-01-2012 | | 2 | 02-01-2012 | 05-02-2012 | | 3 | 05-02-2012 | 07-02-2012 | +----+------------+------------+ ,按时间顺序排列最后一个(前一个)行的('06-02-2012', '10-02-2012'),将使用{更新我试图插入的行的{1}},如果存在按时间顺序重叠

所以,最后,在插入新行后,表格将如下所示:

End_DT

问题是我创建的触发器给了我一个错误,我理解这给出了我编写触发器的方式,但我不知道如何修改它以实现我想要的:

Start_DT

我们认为必须使用+----+------------+------------+ | ID | Start_DT | End_DT | +----+------------+------------+ | 1 | 01-01-2012 | 02-01-2012 | | 2 | 02-01-2012 | 05-02-2012 | | 3 | 05-02-2012 | 06-02-2012 | | 4 | 06-02-2012 | 10-02-2012 | +----+------------+------------+ 才能对前一行设置锁定,以便进行更新。但是将此触发器更改为SQL Error: ORA-04091: table HISTORIC_TIME_TABLE is mutating, trigger/function may not see it ,我不确定我们是否可以在桌面上实现相同的锁定。

我的触发器代码是:

SELECT FOR UDPATE

我在Oracle docs page上在线发现,BEFORE触发器无法修改同一个表中的数据:

AFTER

所以,我正在考虑将触发器修改为create or replace trigger trg_update_historic_time_table before insert on HISTORIC_TIME_TABLE for each row declare cursor upd_hist_tt_cur is select start_dt, end_dt from HISTORIC_TIME_TABLE where (end_dt > sysdate) for update of end_dt; begin for hist_cur_r in upd_hist_tt_cur loop if hist_cur_r.start_dt < :new.start_dt then update HISTORIC_TIME_TABLE set end_dt = :new.start_dt where (start_dt = hist_cur_r.start_dt); commit; else :new.end_dt := hist_cur_r.start_dt; end if; end loop; exception when no_data_found then null; end; 类型,但之后我无法访问Before triggers cannot have INSERT, UPDATE or DELETE statements as their action. Before triggers cannot call procedures that modify SQL data as their action. AFTER个变量。

非常感谢任何帮助。

0 个答案:

没有答案