问题描述
我们以在插入某条数据时需要更新其中一个字段的值为例,即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