关闭

使用 Oracle Instead of 触发器

标签: oracleinsertdateeach测试
5399人阅读 评论(6) 收藏 举报
分类:

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

向一个表中插入一条新记录 如(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
  唯一的方法就是在不满足条件时人工抛出一个错误

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


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:653681次
    • 积分:6848
    • 等级:
    • 排名:第3380名
    • 原创:81篇
    • 转载:18篇
    • 译文:0篇
    • 评论:278条
    最新评论