oracle-触发器练习
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
触发器课堂练习1
1、当向SC表插入数据时,修改(或添加)SC_NUMBER(包括学生学号和选课门数两列)
表格中的数据。
create or replace trigger tr_sc_AR_I
after insert on sc
for each row
begin
update sc_number set scnum=scnum+1where sno=:new.sno;
if sql%notfound then
insert into sc_number values(:new.sno,1);
end if;
end;
测试结果:
2、当删除SC表中数据时,修改(或添加)SC_NUMBER中的数据。
create or replace trigger tr_sc_AR_D
after delete on sc
for each row
begin
update sc_number set scnum=scnum-1where 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、当修改SC表中数据时,若修改的是学号,则对应修改SC_NUMBER表中的选课门数,否则打印“某某
(学生)的学生选课信息已经修改”信息。
create or replace trigger tr_sc_AR_U
after update on sc
for 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||'的学生选课信息已经修改,由原课程'|| trim(:o)||'修改为新课程'||trim(:o));
end if;
if(:old.sno <> :new.sno) then
update sc_number set scnum=scnum+1where sno=:new.sno;
if sql%notfound then
insert into sc_number values(:new.sno,1);
end if;
update sc_number set scnum=scnum-1where 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 if;
end;
测试结果:
触发器课堂练习 2
1、修改STUDENT表数据时,限制不能修改学生的系别(不能修改CS系学生的系别)。create or replace trigger tr_student_BR_U1
before update of sdept on student
for each row
when (old.sdept='CS') --old前没有":"
begin
raise_application_error(-20001,'不能修改CS系学生的系别!');
end;
测试结果:
2、插入课程时,课程号以‘S’开头的课程的学分不能低于3分。
create or replace trigger tr_course_BR_I
before insert on course
for each row
when (new.credit<3and o like'S%')
begin
raise_application_error(-20002,'S开头的课程学分不能低于3分!'); end;
测试结果:
3、不能删除90分以上学生的选课信息。
create or replace trigger tr_sc_BR_D
before delete on sc
for each row
when (old.grade>90)
begin
raise_application_error(-20003,'不能删除90分以上学生的选课信息!'); end;
测试结果:
练习 1
1、插入Student表中数据时,CS系学生的年龄不能大于30岁。
create or replace trigger tr_student_BR_I
before insert on student
for each row
--when(new.sage>30 and new.sdept='CS')
begin
if(:new.sage>30and :new.sdept='CS') then
raise_application_error(-20004,'CS系学生的年龄不能大于30岁!');
end if;
end;
测试结果: