实验内容与完成情况(记录所有的实验过程): 1、对学生课程数据库,编写并执行三个存储过程,分别完成下面功能: (1)统计某一门课的成绩分布情况,即用户输入某一门课程的名称,就可统计出该课程各分数段分布的人数。还要求写出执行存储过程的语句和执行结果。 (答题参考:1. 先建立一个表Rank用来存放存储过程执行后的结果,其中第一列division显示成绩分段划分,第二列sub_sum显示的是成绩在该分数段的学生人数。2. 存储过程带有一个字符型参数@name,用于接受,即用户输入某一门课程的名称,就可统计出该课程各分数段分布的人数。还要求写出执行存储过程的语句和执行结果。用户输入课程名称,便于统计不同课程的分数分布情况。3. 程序中应该判断是否存在用户输入的课程名称,如果不存在要向用户提示:'输入错误,没有该课程!'。建议利用@@ROWCOUNT来判断。) CREATE TABLE Rank( division CHAR(20), sub_sum INT);) select * from rank --存储过程执行完后,rank表中存放的就是这门课程的成绩分布情况 division sub_sum -------------------- ----------- [0,60) 0 [60,70) 0 [70,80) 0 [80,90) 1 [90,100] 1
CREATE TABLE Rank( division char(20), sub_sum int ); INSERT INTO Rank(division) VALUES('[0,60)'),('[60,70)'),('[70,80)'),('[80,90)'),('[90,100]'); GO CREATE PROCEDURE printcourse @pcname char(20) AS DECLARE @pcno char(20),@pcount int UPDATE Course SET Cname=@pcname WHERE Cname=@pcname IF(@@ROWCOUNT=0) BEGIN RAISERROR('您输入的课程号不存在,请重新输入!', 16, 1) RETURN END SELECT @pcno=SC.cno FROM Course,SC WHERE Course.Cno=SC.Cno AND Course.Cname=@pcname SELECT @pcount=COUNT(*) FROM SC WHERE Grade<60 AND Cno=@pcno UPDATE Rank SET sub_sum=@pcount WHERE division='[0,60)'
SELECT @pcount=COUNT(*) FROM SC WHERE Grade>=60 AND Grade<70 AND Cno=@pcno UPDATE Rank SET sub_sum=@pcount WHERE division='[60,70)'
SELECT @pcount=COUNT(*) FROM SC WHERE Grade>=70 AND Grade<80 AND Cno=@pcno UPDATE Rank SET sub_sum=@pcount WHERE division='[70,80)'
SELECT @pcount=COUNT(*) FROM SC WHERE Grade>=80 AND Grade<90 AND Cno=@pcno UPDATE Rank SET sub_sum=@pcount WHERE division='[80,90)'
SELECT @pcount=COUNT(*) FROM SC WHERE Grade>=90 AND Grade<=100 AND Cno=@pcno UPDATE Rank SET sub_sum=@pcount WHERE division='[90,100]'
EXEC printcourse '数据库' SELECT * FROM Rank (2)统计某一门课的平均成绩。(建议:存储过程可带有一个字符型参数值,接受用户输入的课程名称,一个输出参数[用output声明]用于存放返回给调用者的这门课程的平均成绩)。还要求写出执行存储过程的语句和执行结果。 执行结果形为: 数学课的平均成绩为:82.0 CREATE PROCEDURE printavg_course @pcname char(20),@pavg int output AS DECLARE @pcno char(20) UPDATE Course SET Cname=@pcname WHERE Cname=@pcname IF(@@ROWCOUNT=0) BEGIN RAISERROR('您输入的课程号不存在,请重新输入!', 16, 1) RETURN END SELECT @pcno=SC.cno FROM Course,SC WHERE Course.Cno=SC.Cno AND Course.Cname=@pcname SELECT @pavg=AVG(SC.Grade) FROM SC WHERE Cno=@pcno PRINT RTrim(@pcname)+'的平均成绩为:'+CAST(@pavg AS char(5)) GO DECLARE @pavg int EXEC printavg_course '数据库',@pavg output (3)附加题:将学生选课成绩从百分制改为等级制(即A、B、C、D、E五级)。 执行结果形如: sno cno Grade Classified grade --------- ---- ---------------- ---------- 200215121 4 成绩为空! NULL 200215121 6 成绩为空! NULL 200215121 7 成绩为空! NULL 200215122 5 成绩为空! NULL 200215125 1 成绩为空! NULL 200215126 6 不及格 55 200215122 2 良 80 200215121 2 良 85 200215121 3 良 88 200215121 1 优 92 200215122 1 优 92
(11 行受影响) CREATE PROCEDURE printclass_grade AS SELECT Sno,Cno,Grade, CASE WHEN Grade<60 THEN '不及格' WHEN Grade>=60 AND Grade<70 THEN '及格' WHEN Grade>=70 AND Grade<80 THEN '中' WHEN Grade>=80 AND Grade<90 THEN '良' WHEN Grade>=90 AND Grade<=100 THEN '优' ELSE '成绩为空!' END AS 'Grade Classified' FROM SC EXEC printclass_grade 2、对SPJ数据库,创建一个存储过程ins_s_count,功能为根据提供的供应商号,供应商名,供应商所在地等信息,往S表中插入数据,并返回插入该记录之后,S表中的记录数。调用该存储过程实现往S表中插入一条记录(‘S6’,’天盛’,‘福州’),并显示插入该记录之后,S表中的记录数。 CREATE PROCEDURE ins_s_count @psno char(20),@psname char(20),@pstatus int,@pcity char(20) AS DECLARE @pcount int INSERT INTO S(SNO,SNAME,STATUS,CITY) VALUES(@psno,@psname,@pstatus,@pcity) SELECT @pcount=COUNT(*) FROM S PRINT 'S表中的记录数:'+CAST(@pcount AS char(5))
EXEC ins_s_count 'S6','天盛',35,'福州' 3、查看存储过程的定义和内容 (1)定义 存储过程(Stored Procedure) 是存储在服务器上的 Transact-SQL 语句的命名集合 是封装重复性任务的方法 支持用户声明变量、条件执行以及其他强有力的编程特性 (2)内容 存储过程与其他编程语言中的过程类似,它可以 包含执行数据库操作(包括调用其他过程)的编程语句 接受输入参数 向调用过程或批处理返回状态值,以表明成功或失败(以及失败原因) 以输出参数的形式将多个值返回至调用过程或批处理 |