在ORACLE中利用触发器来实现插入数据时更新某字段的值

4,817 阅读1分钟

问题描述

我们以在插入某条数据时需要更新其中一个字段的值为例,即sql语句中执行insert操作,在触发器中进行update操作。

解决方案

这个问题说来也简单,首先需要明白oracle触发器的before与after的区别。 详细的了解可以查询官方文档,这里给出一个Oracle问答社区的简要解释: 链接

具体来说,一个before触发器是可以实现修改新值的功能,而一个after触发器是可以实现对最终执行结果进行检验的目的。由此,我们可以得出结论,要是想在插入数据的时候去更新或者修改某个字段的值,应该使用before触发器。

注:若是直接使用after触发器,在触发器中使用update等操作会报错。
因为在执行insert语句后,触发器被触发,此时insert事务还没有commit,故在触发器中对同一条语句进行update操作会报错。
若是在触发器中使用  pragma autonomous_transaction可以避免错误,但是update还是无法执行成功,因为此时表里还没有insert的数据,自然也就无法update成功

综上所述,给一个例子

create or replace trigger T_TEST
  before insert
  on test_table 
  for each row
declare
 
begin
  if instr(:new.sn,'P')>0 then 
    :new.t_level:=1;
    end if;
end T_TEST;

这样就可以完成在insert一条语句的同时,更新其中某个字段的值。