oracle-触发器练习_第1页
oracle-触发器练习_第2页
oracle-触发器练习_第3页
oracle-触发器练习_第4页
oracle-触发器练习_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、触发器课堂练习1 1、 当向SC表插入数据时,修改(或添加)SC_NUMBER(包括学生学号和选课门数两列)表格中的数据。create or replace trigger tr_sc_AR_Iafter insert on scfor each row begin update sc_number set scnum=scnum+1 where sno=:new.sno; if sql%notfound then insert into sc_number values(:new.sno,1); end if; end;测试结果:2、 当删除SC表中数据时,修改(或添加)SC_NUMBER中

2、的数据。create or replace trigger tr_sc_AR_Dafter delete on scfor each row begin update sc_number set scnum=scnum-1 where sno=:old.sno; select scnum into pk_trigger.tr_scnum from sc_number where sno=:old.sno; if(pk_trigger.tr_scnum=0) then delete from sc_number where sno=:old.sno; end if;end;测试结果:3、 当修改

3、SC表中数据时,若修改的是学号,则对应修改SC_NUMBER表中的选课门数,否则打印“某某(学生姓名)的学生选课信息已经修改”信息。create or replace trigger tr_sc_AR_Uafter update on scfor each row begin if(:old.sno = :new.sno) then select sname into pk_trigger.tr_sname from student where sno=:new.sno; dbms_output.put_line(pk_trigger.tr_sname|'的学生选课信息已经修改,由原课

4、程'| trim(:o)|'修改为新课程'|trim(:o); end if; if(:old.sno <> :new.sno) then update sc_number set scnum=scnum+1 where sno=:new.sno; if sql%notfound then insert into sc_number values(:new.sno,1); end if; update sc_number set scnum=scnum-1 where sno=:old.sno; select scnum into pk_trigger.tr

5、_scnum from sc_number where sno=:old.sno; if(pk_trigger.tr_scnum=0) then delete from sc_number where sno=:old.sno; end if; end if; end;测试结果:触发器课堂练习 21、 修改STUDENT表数据时,限制不能修改学生的系别(不能修改CS系学生的系别)。create or replace trigger tr_student_BR_U1before update of sdept on studentfor each rowwhen (old.sdept='

6、CS') -old前没有":"begin raise_application_error(-20001,'不能修改CS系学生的系别!');end;测试结果:2、 插入课程时,课程号以S开头的课程的学分不能低于3分。create or replace trigger tr_course_BR_Ibefore insert on course for each rowwhen (new.credit<3 and o like 'S%')begin raise_application_error(-20002,'S开头的课程学

7、分不能低于3分!');end;测试结果:3、 不能删除90分以上学生的选课信息。create or replace trigger tr_sc_BR_Dbefore delete on scfor each rowwhen (old.grade>90)begin raise_application_error(-20003,'不能删除90分以上学生的选课信息!');end;测试结果:练习 11、插入Student表中数据时,CS系学生的年龄不能大于30岁。 create or replace trigger tr_student_BR_Ibefore insert

8、 on studentfor each row -when(new.sage>30 and new.sdept='CS') begin if(:new.sage>30 and :new.sdept='CS') then raise_application_error(-20004,'CS系学生的年龄不能大于30岁!'); end if;end;测试结果:2、当修改Student表中的年龄字段时,使其只能增加,不能减少。 create or replace trigger tr_student_BR_Ubefore update of

9、sage on student for each row when (new.sage<old.sage)begin raise_application_error(-20005,'年龄只能增加不能减少!');end;测试结果:3、删除Student表中的学生信息时,判断在SC表中该学生的平均成绩是否高于60,若高于60,则不能删除,否则允许删除,同时删除SC表该学生对应的选课信息。create or replace trigger tr_student_BR_Dbefore delete on studentfor each rowdeclare avg_score n

10、umber; begin select avg(grade) into avg_score from sc where sc.sno =:old.sno; if(avg_score > 60) then raise_application_error(-20006,'不能删除平均分大于60的学生信息!'); end if; if(avg_score <= 60) then delete from sc where sc.sno=:old.sno; end if; end;测试结果:练习 2在Student表中添加列:sum_Grade(总成绩),avg_grade(

11、平均成绩)。在SC表中作一触发器,当添加,删除或修改一行之后,将该学生在Student表中的总成绩和平均成绩相应改变。 create or replace package pk_triggeris tr_scnum smallint;-sc_number表中的当前选课数量 tr_sname student.sname%type; tr_cno o%type;-记录正在更新的课程号 tr_newsno sc.sno%type;-记录更新后的学生号 tr_oldsno sc.sno%type;-记录更新前的学生号end pk_trigger;create or replace trigger tr

12、_sc_BR_I_U_Dbefore insert or update or delete on scfor each rowbegin pk_trigger.tr_newsno := :new.sno; pk_trigger.tr_oldsno := :old.sno; end;create or replace trigger tr_sc_AL_I_U_Dafter insert or update or delete on scdeclare v_sum number; v_avg number; begin -更新变化之前的学生的总分和平均成绩 select sum(grade),av

13、g(grade) into v_sum,v_avg from sc where sno=pk_trigger.tr_oldsno; update student set sum_grade=v_sum,avg_grade=v_avg where sno=pk_trigger.tr_oldsno; -更新变化之后的学生总分和平均分 select sum(grade),avg(grade) into v_sum,v_avg from sc where sno=pk_trigger.tr_newsno; update student set sum_grade=v_sum,avg_grade=v_a

14、vg where sno=pk_trigger.tr_newsno; end;测试结果:修改成绩修改学号删除练习 3插入或修改(修改课程号时)选课信息时,若该课程的选课人数已满,则不允许操作,并抛出相应的错误提示。create or replace package pk_triggeris tr_scnum smallint;-sc_number表中的当前选课数量 tr_sname student.sname%type; tr_cno o%type;-记录正在更新的课程号 tr_newsno sc.sno%type;-记录更新后的学生号 tr_oldsno sc.sno%type;-记录更新前

15、的学生号end pk_trigger;create or replace trigger tr_sc_BR_IUbefore insert or update on scfor each rowbegin pk_trigger.tr_cno:=:o;end;create or replace trigger tr_sc_AL_IUafter insert or update on scdeclare v_snumber smallint; v_scnt smallint; begin -查询课程最大选课人数 select snumber into v_snumber from course where cno=pk_trigger.tr_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论