实验七: 存储过程

实验内容与完成情况(记录所有的实验过程):

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)内容

存储过程与其他编程语言中的过程类似,它可以

包含执行数据库操作(包括调用其他过程)的编程语句

接受输入参数

向调用过程或批处理返回状态值,以表明成功或失败(以及失败原因)

以输出参数的形式将多个值返回至调用过程或批处理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章