Heim >Datenbank >MySQL-Tutorial >Oralce触发器中更新本表的方法
Oralce触发器中更新本表的方法,本文谈到两个问题:1,update触发器before和after 的区别。2,在A表某个字段个更新之后,触发器触
本文谈到两个问题:1,update触发器before和after 的区别。2,在A表某个字段个更新之后,触发器触发执行,在触发器
-- Create table
create table TEST_UP_TRI
(
ID NUMBER,
NAME VARCHAR2(20),
AGE NUMBER(2)
)
中如何更新A表的其他字段。
举例说明:
为该表创建一个触发器,功能是:当name字段发生改变时,将age字段设置为20,触发器如下:
create or replace trigger testtab_up_tri before update of name on test_up_tri
for each row
declare
begin
:new.age :=20;
end;
测试如下图所示:
下面来解释文章开头提出的两个问题:
1,after和before的区别。
一个是在记录操作之前触发,一个是在记录操作之后触发。
比如表之间定义的有外键,在删除主键时,必须要先删除外键表,这时就有先后之分,after是在修改触发语句影响的每行和可能应用相应的完整性约束后,若不违反触发器限制则为当前行执行触发器动作,与BEFORE行触发器不同的是,AFTER行触发器锁住行。因此,,after中不可以使用:new.age : = 20这样的语句。
2,使用update…set来更新本表是不可以的只能使用:new :=**的方式,如果使用了可以编译通过,但执行时,会出现如下错误:
ORA-04091: 表 ZXL.TEST_UP_TRI 发生了变化, 触发器/函数不能读它
ORA-06512: 在 "ZXL.TESTTAB_UP_TRI", line 5
ORA-04088: 触发器 'ZXL.TESTTAB_UP_TRI' 执行过程中出错
3,:new :=**的方式也可以使用select 20 into :new.age来代替,这样当我们查到一个字段是可以直接通过select ……into :new.age的方式直接更新确定的字段。