oracle触发器练习.docx
- 文档编号:4034248
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:15
- 大小:456.30KB
oracle触发器练习.docx
《oracle触发器练习.docx》由会员分享,可在线阅读,更多相关《oracle触发器练习.docx(15页珍藏版)》请在冰豆网上搜索。
oracle触发器练习
oracle-触发器练习
触发器课堂练习1
1、当向SC表插入数据时,修改(或添加)SC_NUMBER(包括学生学号和选课门数两列)表格中的数据。
createorreplacetriggertr_sc_AR_I
afterinsertonsc
foreachrow
begin
updatesc_numbersetscnum=scnum+1wheresno=:
new.sno;
ifsql%notfoundthen
insertintosc_numbervalues(:
new.sno,1);
endif;
end;
测试结果:
2、当删除SC表中数据时,修改(或添加)SC_NUMBER中的数据。
createorreplacetriggertr_sc_AR_D
afterdeleteonsc
触发器课堂练习2
1、修改STUDENT表数据时,限制不能修改学生的系别(不能修改CS系学生的系别)。
createorreplacetriggertr_student_BR_U1
beforeupdateofsdeptonstudent
foreachrow
when(old.sdept='CS')--old前没有":
"
begin
raise_application_error(-20001,'不能修改CS系学生的系别!
');
end;
测试结果:
2、插入课程时,课程号以‘S’开头的课程的学分不能低于3分。
createorreplacetriggertr_course_BR_I
beforeinsertoncourse
foreachrow
when(new.credit<3andolike'S%')
begin
raise_application_error(-20002,'S开头的课程学分不能低于3分!
');
end;
测试结果:
3、不能删除90分以上学生的选课信息。
createorreplacetriggertr_sc_BR_D
beforedeleteonsc
foreachrow
when(old.grade>90)
begin
raise_application_error(-20003,'不能删除90分以上学生的选课信息!
');
end;
测试结果:
练习1
1、插入Student表中数据时,CS系学生的年龄不能大于30岁。
createorreplacetriggertr_student_BR_I
beforeinsertonstudent
foreachrow
--when(new.sage>30andnew.sdept='CS')
begin
if(:
new.sage>30and:
new.sdept='CS')then
raise_application_error(-20004,'CS系学生的年龄不能大于30岁!
');
endif;
end;
测试结果:
2、当修改Student表中的年龄字段时,使其只能增加,不能减少。
createorreplacetriggertr_student_BR_U
beforeupdateofsageonstudent
foreachrow
when(new.sage begin raise_application_error(-20005,'年龄只能增加不能减少! '); end; 测试结果: 3、删除Student表中的学生信息时,判断在SC表中该学生的平均成绩是否高于60,若高于60,则不能删除,否则允许删除,同时删除SC表该学生对应的选课信息。 createorreplacetriggertr_student_BR_D beforedeleteonstudent foreachrow declare avg_scorenumber; begin selectavg(grade)intoavg_scorefromscwheresc.sno=: old.sno; if(avg_score>60)then raise_application_error(-20006,'不能删除平均分大于60的学生信息! '); endif; if(avg_score<=60)then deletefromscwheresc.sno=: old.sno; endif; end; 测试结果: 练习2 在Student表中添加列: sum_Grade(总成绩),avg_grade(平均成绩)。 在SC表中作一触发器,当添加,删除或修改一行之后,将该学生在Student表中的总成绩和平均成绩相应改变。 createorreplacepackagepk_trigger is tr_scnumsmallint;--sc_number表中的当前选课数量 tr_snamestudent.sname%type; tr_cnoo%type;--记录正在更新的课程号 tr_newsnosc.sno%type;--记录更新后的学生号 tr_oldsnosc.sno%type;--记录更新前的学生号 endpk_trigger; createorreplacetriggertr_sc_BR_I_U_D beforeinsertorupdateordeleteonsc foreachrow begin pk_trigger.tr_newsno: =: new.sno; pk_trigger.tr_oldsno: =: old.sno; end; createorreplacetriggertr_sc_AL_I_U_D afterinsertorupdateordeleteonsc declare v_sumnumber; v_avgnumber; begin --更新变化之前的学生的总分和平均成绩 selectsum(grade),avg(grade)intov_sum,v_avgfromscwheresno=pk_trigger.tr_oldsno; updatestudentsetsum_grade=v_sum,avg_grade=v_avgwheresno=pk_trigger.tr_oldsno; --更新变化之后的学生总分和平均分 selectsum(grade),avg(grade)intov_sum,v_avgfromscwheresno=pk_trigger.tr_newsno; updatestudentsetsum_grade=v_sum,avg_grade=v_avgwheresno=pk_trigger.tr_newsno; end; 测试结果: 修改成绩 修改学号 删除 练习3 插入或修改(修改课程号时)选课信息时,若该课程的选课人数已满,则不允许操作,并抛出相应的错误提示。 createorreplacepackagepk_trigger is tr_scnumsmallint;--sc_number表中的当前选课数量 tr_snamestudent.sname%type; tr_cnoo%type;--记录正在更新的课程号 tr_newsnosc.sno%type;--记录更新后的学生号 tr_oldsnosc.sno%type;--记录更新前的学生号 endpk_trigger; createorreplacetriggertr_sc_BR_IU beforeinsertorupdateonsc foreachrow begin pk_trigger.tr_cno: =: o; end; createorreplacetriggertr_sc_AL_IU afterinsertorupdateonsc declare v_snumbersmallint; v_scntsmallint; begin --查询课程最大选课人数 selectsnumberintov_snumberfromcoursewherecno=pk_trigger.tr_cno; --查询当前选课人数 selectcount(sno)intov_scntfromscwherecno=pk_trigger.tr_cno; --如果选课人数已满,则抛出相应错误提示 if(v_snumber raise_application_error(-20008,'课程'||trim(pk_trigger.tr_cno)||'选课人数已满! '); endif; end; 测试结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- oracle 触发器 练习
![提示](https://static.bdocx.com/images/bang_tan.gif)