本文主要是介绍使用 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 Instead of 触发器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!