已有表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;

解决方案 »

  1.   

    不好意思了。刚才用的在其他站点的url表描述:表中数据
      

  2.   

    --图挂了,凭感觉写的
    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;
      

  3.   

    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 where 学号 = :new.学号 and 课程代码 = :new.课程代码;
     select :new.期末成绩 into newFinal from examscore where 学号 = :new.学号 and 课程代码 = :new.课程代码;
     update examscore set 总成绩=newFinal+newMid;
     commit;
    end SumScoreTri;
    没有测试
    提示:字段名称最好不要用中文
      

  4.   

    显然,楼上的都不能吧
    会引发“变异表”问题吧
    写两个触发器,一个行级的,一个语句级的,根据语句级获取的跟新之前的OLD值来修改行级!  用包来存全局变量(语句级触发器获取的数据)
      

  5.   


    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;其实,“总成绩”用计算列,不是更方便。
      

  6.   

    SQL> create table EXAMSCORE
      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> 
      

  7.   

    --采取变量赋值的方法可以阻止变异表的事情,下面是例子
    [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]
      

  8.   


    多谢了 但是有点儿看不懂。你能帮忙解释一下那个触发器不。为什么是before 还有基本思路是什么 谢谢你啦。