(转)oracle触发器----增 删 改

:new --为一个引用最新的列值;
:old --为一个引用以前的列值; 这两个变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而insert只有:new ,delect 只有:old;

Old,New新解:
:new中存储的是T表更新内容中已经更新完成的字段;
:old中存储的是更新前的tid内容;
http://topic.csdn.net/u/20071027/22/e560007b-de46-4d34-9c13-f4fe1a08c89b.html



//触发器名UserToTemp
create or replace trigger UserToTemp after insert or update or delete
on user_info for each row//对表user_info操作时触发以下事件
declare//声明变量
integrity_error exception;
errno integer;
errmsg char(200);
dummy integer;
found boolean;
sexy varchar2(20);

begin
if inserting then
select sex into sexy from user_info_test;//取出user_info_test表中的sex字段的值赋值给变量sexy
insert into User_info_temp(ID,UserName,PassWord,Createdate,Status) values(:NEW.ID,:NEW.UserName,sexy,:NEW.createdate,:NEW.status);//:NEW.UserName的值为表user_info新增加的数据
elsif updating then
update User_info_temp set ID=:NEW.ID,UserName=:NEW.UserName,PassWord=:NEW.PassWord,Status=:NEW.Status where id=:OLD.id;
elsif deleting then
delete from User_info_temp where id=:OLD.id;
end if;
exception
when integrity_error then
raise_application_error(errno, errmsg);
end;



另,在使用触发器的过程中,会遇到ORA-04091的错误,这个错误与触发器中对基于进行了SELECT等操作有关。

create or replace trigger tri_card_ins
after insert on card
for each row

declare
T_COUNT number(10);

begin

select count(*) into T_COUNT from card c,bts b
where c.ne_name = b.bts_num and c.ne_name = :new.ne_name;

update bts s set s.trx_count =T_COUNT
where s.bts_num = :new.ne_name;

end tri_card_ins;

下面是错误信息。
[img]

[/img]

这个应该是不可以的。《精通Oracle 10g pl sql编程》

DML触发器使用注意事项:

当编写DML触发器时,触发器代码不能从触发器所对应的基表中读取数据。例如,如果要基于EMP表建立触发器,那么该触发器的执行代码不能包含对EMP表的查询操作。尽管在建立触发器时不会出现任何错误,但在执行相应触发操作时会显示错误信息。

你的问题应该是对CARD表建立的触发器,又查询CARD表。

提问人的追问 2011-07-01 09:25 那么如果我如要现实这样的功能,该怎么做啊?
回答人的补充 2011-07-01 13:47 实现这个功能应该有很多种方法。比如说可以在同一个SESSION里先执行INSERT的操作,再执行UPDATE.或者把整个逻辑写到一个存储过程里。

这样也可以在执行INSERT操作失败时都会回滚,而不会出现脏数据。
提问人的追问 2011-07-01 15:29 小弟刚接触oracle ,不太理解你说的session怎么使用。能给个例子吗?最好具体的点。谢谢啦。谢谢啦。
回答人的补充 2011-07-02 12:09 可以建一个中间表。

CREATE TABLE CARD_MAP (
NE_NAME VARCHAR2(20),
C_DATE DATE
);

修改触发器。应该可以答到你的要求

create or replace trigger tri_card_ins
after insert on card
for each row

declare
T_COUNT number(10);

begin
INSERT INTO CARD_MAP(NE_NAME,C_DATE) VALUES(:NEW.NE_NAME, SYSDATE);

select count(*) into T_COUNT from CARD_MAP c,bts b
where c.ne_name = b.bts_num and c.ne_name = :new.ne_name;

update bts s set s.trx_count =T_COUNT
where s.bts_num = :new.ne_name;

end tri_card_ins;
回答人的补充 2011-07-05 22:44 把触发修改一下。不需要每行触发。把你写的触发器中去除FOR EACH ROW


文章分别引自于:
1、http://www.iteye.com/topic/882897;
2、http://wenwen.soso.com/z/q300377397.htm?sp=2080;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值