已有表examscore 表中总成绩应该等于期中成绩与期末成绩之和。
现在希望写一个触发器 在期中成绩或期末成绩改变时 总成绩随之改变
————————————————————————————————————
表描述如下:表中数据:——————————————————————————————————————————————————
我的代码。但是不对。没写过这东西。
希望大家热心帮助一下 不胜感激。DECLARE PRAGMA AUTONOMOUS_TRANSACTIO;
create or replace trigger SumScoreTri
after update on examscore
for each row
declare
newMid INT;
newFinal INT;
-- local variables here
begin
select :new.期中成绩 into newMid from examscore;
select :new.期末成绩 into newFinal from examscore;
update examscore set 总成绩=newFinal+newMid;
end SumScoreTri;
现在希望写一个触发器 在期中成绩或期末成绩改变时 总成绩随之改变
————————————————————————————————————
表描述如下:表中数据:——————————————————————————————————————————————————
我的代码。但是不对。没写过这东西。
希望大家热心帮助一下 不胜感激。DECLARE PRAGMA AUTONOMOUS_TRANSACTIO;
create or replace trigger SumScoreTri
after update on examscore
for each row
declare
newMid INT;
newFinal INT;
-- local variables here
begin
select :new.期中成绩 into newMid from examscore;
select :new.期末成绩 into newFinal from examscore;
update examscore set 总成绩=newFinal+newMid;
end SumScoreTri;
create or replace trigger SumScoreTri
after update on examscore
for each row
begin
update examscore set 总成绩=:new.期末成绩+:new.期中成绩
where 期末成绩=:old.期中成绩 and 其中成绩=:old.期中成绩;
commit;
end SumScoreTri;
create or replace trigger SumScoreTri
after update on examscore
for each row
declare
newMid INT;
newFinal INT;
-- local variables here
begin
select :new.期中成绩 into newMid from examscore where 学号 = :new.学号 and 课程代码 = :new.课程代码;
select :new.期末成绩 into newFinal from examscore where 学号 = :new.学号 and 课程代码 = :new.课程代码;
update examscore set 总成绩=newFinal+newMid;
commit;
end SumScoreTri;
没有测试
提示:字段名称最好不要用中文
会引发“变异表”问题吧
写两个触发器,一个行级的,一个语句级的,根据语句级获取的跟新之前的OLD值来修改行级! 用包来存全局变量(语句级触发器获取的数据)
create table scores (
sno char(4), sname varchar2(30),
course varchar2(30),
mid_score number(5,2), fin_score number(5,2),
sum_score number(5,2));insert into scores values('1001','tom','math',80,70,150);
commit;create or replace trigger cal_sum_score
before update of mid_score,fin_score
on scores@aegean
for each row
begin
:new.sum_score:=:new.mid_score+:new.fin_score;
end;
/update scores set mid_score=75 where sno='1001' and course='math';
commit;select * from scores;其实,“总成绩”用计算列,不是更方便。
2 (
3 学号 VARCHAR2(4),
4 姓名 VARCHAR2(20),
5 课程代码 VARCHAR2(4),
6 课程名称 VARCHAR2(30),
7 期中成绩 NUMBER(3),
8 期末成绩 NUMBER(3),
9 总成绩 NUMBER(3)
10 )
11 ;
Table created
SQL>
SQL> insert into examscore
2 values(1001,'soo','001','信号与系统',10,40,50);
1 row inserted
SQL> commit;
Commit complete
SQL>
SQL> create or replace trigger TR_EXAM1
2 before update of "期末成绩" on examscore
3 for each row
4 declare
5 -- local variables here
6 begin
7 :new."总成绩":=:new."期末成绩"+:new."期中成绩";
8 end TR_EXAM1;
9 /
Trigger created
SQL>
SQL> create or replace trigger TR_EXAM2
2 before update of "期中成绩" on examscore
3 for each row
4 declare
5 -- local variables here
6 begin
7 :new."总成绩":=:new."期末成绩"+:new."期中成绩";
8 end TR_EXAM2;
9 /
Trigger created
SQL> update examscore t set t.期中成绩=50;
1 row updated
SQL> select * from examscore;
学号 姓名 课程代码 课程名称 期中成绩 期末成绩 总成绩
---- -------------------- -------- ------------------------------ -------- -------- ------
1001 soo 001 信号与系统 50 40 90
SQL> update examscore t set t.期末成绩=20;
1 row updated
SQL> select * from examscore;
学号 姓名 课程代码 课程名称 期中成绩 期末成绩 总成绩
---- -------------------- -------- ------------------------------ -------- -------- ------
1001 soo 001 信号与系统 50 20 70
SQL> update examscore t set (t.期中成绩,t.期末成绩)=(select 10,30 from dual);
1 row updated
SQL> select * from examscore;
学号 姓名 课程代码 课程名称 期中成绩 期末成绩 总成绩
---- -------------------- -------- ------------------------------ -------- -------- ------
1001 soo 001 信号与系统 10 30 40
SQL>
[code=SQL]
SQL> create table examscore(学号 varchar2(4) not null,
2 姓名 varchar2(20),
3 课程代码 varchar2(4) not null,
4 课程名称 varchar2(30),
5 期中成绩 number(3),
6 期末成绩 number(3),
7 总成绩 number(3)
8 )
9 /表已创建。SQL> insert into examscore values('001','王军','058','计算机',60,80,140)
2 /已创建 1 行。SQL> commit;提交完成。SQL> create or replace trigger SumScoreTri
2 before insert or update on examscore for each row
3 declare
4 v_sum examscore.总成绩%type;
5 begin
6 v_sum:=:new.期中成绩+:new.期末成绩;
7 if v_sum<>:new.总成绩 then
8 :new.总成绩:=v_sum;
9 end if;
10 end;
11 /触发器已创建SQL> update examscore set 期末成绩=60 where 姓名='王军'
2 /已更新 1 行。SQL> commit;提交完成。SQL> select * from examscore
2 /学号 姓名 课程 课程名称 期中成绩 期末成绩 总成绩
---- -------------------- ---- ------------------------------ ---------- ---------- ----------
001 王军 058 计算机 60 60 120[/code]
多谢了 但是有点儿看不懂。你能帮忙解释一下那个触发器不。为什么是before 还有基本思路是什么 谢谢你啦。