`

Oracle中的触发器

阅读更多
--Trigger:
--顾名思义,new是新插入的数据,old是原来的数据
--insert只会有new,代表着要插入的新记录
--delete只会有old,代表着要删除的记录
--update由于执行的是先删除旧的记录,再插入新的记录,因此new和old都会有,且含义与上面的相同 
--已有表examscore 表中总成绩应该等于期中成绩与期末成绩之和。 
--现在希望写一个触发器 在期中成绩或期末成绩改变时 总成绩随之改变  

--采取变量赋值的方法可以阻止变异表的事情,下面是例子
create table examscore(
  学号 varchar2(4) not null,
  姓名 varchar2(20),
  课程代码 varchar2(4) not null,
  课程名称 varchar2(30),
  期中成绩 number(3) default 0,
  期末成绩 number(3) default 0,
  总成绩 number(3) default 0
  );
  /
insert into examscore values('001','王军','058','计算机',60,80,140);
commit;

create or replace trigger SumScoreTri
before insert or update on examscore for each row
declare
v_sum eaxmscore.总成绩%type;
begin
v_sum := :new.期中成绩 + :new.期末成绩;
if(v_sum <> :new.总成绩 then
:new.总成绩 := v_sum;
end if;
end;
/

update examscore set 期末成绩=60 where 姓名='王军';
commit;


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics