oracle instead of update,使用 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

唯一的方法就是在不满足条件时人工抛出一个错误

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值