当前位置:编程问答 > Unix/Linux >

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

oralce触发器中更新本表的方法
 
本文谈到两个问题:1,update触发器before和after 的区别。2,在A表某个字段个更新之后,触发器触发执行,在触发器  www.zzzyk.com  
[sql] 
-- Create table  
create table TEST_UP_TRI  
(  
  ID   NUMBER,  
  NAME VARCHAR2(20),  
  AGE  NUMBER(2)  
)  
 
中如何更新A表的其他字段。
举例说明:
 
为该表创建一个触发器,功能是:当name字段发生改变时,将age字段设置为20,触发器如下:
[sql] 
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的方式直接更新确定的字段。
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,