首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

(转)oracle触发器-增 删 改

2012-07-16 
(转)oracle触发器----增 删 改:new --为一个引用最新的列值:old --为一个引用以前的列值 这两个变量只有

(转)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;



热点排行