|
--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; |
|
|