孙钰佳的博客

转载本BLOG的原创文章请注明作者和出处,谢谢 !

使用 Oracle Instead of 触发器

今天在论坛上遇到个触发器的问题,需求如下:

向一个表中插入一条新记录 如(2007 ,a)
触发器  查询该表中如果有(2007 ,a)这条数据就更新这条数据中的另一个字段  如果没有就插入一条新记录触发器
  if(如果存在)
    更新记录
  else
    插入新记录

由于本人也不经常写复杂的触发器,经过一番尝试终于得出结论.如果想要中止触发动作在oracle里面似乎只能抛出异常,否则是无法实现的,只有使用Instead of 才行,于是建立视图

create or replace view vw_ayear as
select "YR","STARTFLAG","STARTDATE","CLOSETAG","TURNFLAG" from ayear
然后在写触发器

CREATE OR REPLACE TRIGGER ayear_TR
INSTEAD OF INSERT
ON vw_ayear
FOR EACH ROW
DECLARE TEMP INT ;
 BEGIN
  select 0 into TEMP from dual;
  select count(*) into TEMP from ayear a where a.yr=:new.yr and a.startflag=:new.startflag;
  IF TEMP <> 0 THEN
   UPDATE ayear a SET a.startdate = :new.startdate , a.closetag=:new.closetag , a.turnflag=:new.turnflag
     where a.yr=:new.yr and a.startflag=:new.startflag;
 ELSE
     insert into ayear values(:new.yr,:new.startflag,:new.startdate,:new.closetag,:new.turnflag);
 END IF;
 END;
 
最后测试

insert into vw_ayear values('2008','1',to_date('2007-04-01','yyyy-MM-dd'),'0','0')

  触发器里面不能有commit,rollback的操作  
  无法操作触发器所在的这个表,不管是before 还是after
  唯一的方法就是在不满足条件时人工抛出一个错误

还有就是使用视图了,呵呵,不知道说的对不对如果错了还请高人赐教.


阅读更多
个人分类: ORACLE
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

使用 Oracle Instead of 触发器

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭