Oralce触发器中更新本表的方法


本文谈到两个问题: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的方式直接更新确定的字段。

相关内容

    暂无相关文章