数据库课程设计实验
- 格式:doc
- 大小:118.22 KB
- 文档页数:7
实验5 存储过程与触发器
1.实验目的与要求:
1.1 掌握存储过程使用
1.2 掌握触发器使用
1.3 掌握游标使用
2.实验环境与实验器材:
计算机,网络环境,投影设备。
实验相关软件:Window xp、PowerDesigner、SQL Server 2008。
3.实验内容与步骤
使用已经建立的数据库students及student course sc表实现下面操作。
3.1 创建满足下述要求的存储过程,并查看执行结果。
1)查询每个学生的修课总学分,要求列出学生学号及总分数。
CREATE procedure p1 as
select student.sno,sum(credit) 总学分
from student,course,SC
where student.sno=sc.sno and o=o
group by student.sno;
2)查询学生的学号、姓名、选修的课程号、课程名、课程学分,将学生所在系作为输入参数,默认值“计算机”。执行此存储过程,并分别指定一些不同的输入参数值,查看执行结果。
ALTER PROCEDURE p2 @sdept char(20)='计算机系'
AS
SELECT student.Sno,Sname, Sdept, o,Cname, Credit FROM Student,course,sc
WHERE student.sno=sc.sno and o=o and Sdept = @sdept;
exec p2;
exec p2 '信息管理系';
exec p2 '通信工程系';
3)查询指定系的男生人数,其中系为输入参数,人数为输出参数。
CREATE PROCEDURE p3
@sdept char(20),@count int output
AS
SELECT @count=count(*) from student where ssex='男' and sdept=@sdept;
DECLARE @res int
EXEC p3 '计算机系',@res OUTPUT
PRINT @res;
4)删除指定学生的修课记录,其中学号为输入参数。
CREATE PROCEDURE p4
@sno char(20)
AS
delete from sc where sno=@sno;
EXEC p4 '0611102';
5)修改指定课程的开课学期。输入参数为:课程号和修改后的开课学期。
CREATE PROCEDURE p5
@cno char(5),@sem int
AS
update course set semster=@sem where cno=@cno;
exec p5 'c004',3;
3.2 创建满足下述要求的触发器(前后均可),并查看执行结果。
1)限制学生的年龄在15-45之间。
create trigger t1 on student after insert,update as
if exists(select * from inserted where sage not between 15 and 45)
begin
print '学生年龄不在15-45之间,请重新输入!';
rollback;
End
insert into student values('0631106','林道','男',10,'建筑设计系');
2)限制学生所在系的取值范围为{计算机,信息管理系、数学系、通信工程系} 。
create trigger t2 on student after insert,update as
if exists(select * from inserted where sdept not in('计算机系','信息管理系','数学系','通信工程系'))
begin
print '学生所在系输入错误,请重新输入!';
rollback;
end
insert into student values('0631106','林道','男',20,'建筑设计系');
3)限制每个学期开设的课程总学分在20-30范围内。
create trigger t3 on course after insert,update as
if((select sum(Credit) from course where semster in(select semster from inserted))not
between 20 and 30)
begin
print '课程总学分超出范围!';
rollback;
end
insert into course values('c010','算法分析',30,1);
4)限制每个学生每学期选修课门数不能超过6门。
create trigger t4 on sc after insert,update as
if(select count(*) from sc,course where o=o and semster in(select semster from course where o in(select cno from inserted))and sc.sno in(select sno from
inserted))>6
begin
print '该学生选课门数超过6门!';
rollback;
end
insert into sc values('0611101','c009',null),('0611101','c010',null),
('0611101','c011',null),('0611101','c012',null),('0611101','c013',null);
3.3 创建满足下述要求的游标,并查看执行结果。
!)列出VB考试成绩最高的前2名和最后1名学生的学号、姓名、所在系和VB成绩。显示结果。
DECLARE cs1 scroll CURSOR FOR
SELECT student.Sno,Sname,Sdept,Grade
FROM Student,sc,course
WHERE student.sno=sc.sno and o=o and cname='VB'
ORDER BY Grade DESC
open cs1
fetch next from cs1;
fetch next from cs1;
fetch last from cs1;
close cs1;
deallocate cs1;
2)列出每个系年龄最大2名学生的姓名和年龄,结果按年龄降序排序。显示结果。
declare @Sdept char(20),@Sname char(7),@sage int
declare cs2 cursor for
select distinct sdept from student
open cs2
fetch next from cs2 into @sdept
while @@FETCH_STATUS=0
begin
print @Sdept;
print '姓名 年龄';
declare cs3 cursor for
select Sname,Sage
from student
where sdept=@sdept
order by sage desc;
open cs3
fetch next from cs3 into @sname,@sage;
print @Sname+cast(@sage as char(4))
fetch next from cs3 into @sname,@sage;
print @Sname+cast(@sage as char(4)) close cs3;
deallocate cs3;
print ''
fetch next from cs2 into @sdept
end
close cs2;
deallocate cs2;
4.思考与总结