【实验目的】
1、了解游标、存储过程的作用
2、熟悉游标和存储过程的特点
3、掌握游标的使用步骤和存储过程的创建和管理
【实验设备及器材】
1、硬件:PC机;
2、软件:(1)Windows7; (2)Microsoft SQL Server 2012。
【主要内容】
游标的使用步骤;当前游标集的修改;存储过程的创建和管理。
【实验内容及要求】/【实验步骤及结果】
下面所有的操作在“学生管理数据库”中进行。(附加数据库,T-SQL语句)
一、存储过程操作
1.设计简单存储过程AVG_GRADE,求出计算机原理这门课程的平均成绩;并执行验证。
USE?学生管理数据库
GO
CREATE?PROCEDURE?AVG_GRADE
AS
SELECT?成绩信息表.课程号,Round?(AVG(成绩信息表.成绩),1)?
AS?'平均成绩'
FROM?学生信息表 join?成绩信息表 ON?学生信息表.学号=成绩信息表.学号 join?课程信息表 ON?课程信息表.课程号=成绩信息表.课程号 and?课程信息表.课程名='计算机原理'
GROUP?BY??成绩信息表.课程号
EXEC??AVG_GRADE
2.设计存储过程S_C_SC,求出某课程的考试学生姓名和成绩;并执行验证。(请注意:请考虑是否已经存在该存储过程的情况,如果已有该存储过程,请先删除,再创建)
USE?学生管理数据库
GO
IF?EXISTS?(SELECT?*?FROM?SYS.OBJECTS?WHERE?NAME='S_C_SC'?AND?TYPE='P')
??DROP?PROCEDURE?S_C_SC
GO
CREATE?PROCEDURE?S_C_SC
??@course varchar(50)
AS
??SELECT?课程信息表.课程名,学生信息表.姓名,成绩信息表.成绩
??FROM?学生信息表 JOIN?成绩信息表 ?ON?学生信息表.学号=成绩信息表.学号
???????JOIN?课程信息表 ?ON?成绩信息表.课程号=课程信息表.课程号 AND?课程名=@course
GO
EXEC S_C_SC '计算机原理'
USE?学生管理数据库
GO
ALTER?PROCEDURE?S_C_SC
??@course varchar(50)
AS
??SELECT?AVG(成绩信息表.成绩)?AS?平均分,COUNT(?@course)?AS?人数
??FROM?课程信息表 ?JOIN?成绩信息表 ?ON?课程信息表.课程号=成绩信息表.课程号 AND?课程名=@course
GO
EXEC?S_C_SC?'计算机原理'
4.建立存储过程SNAME_S,查询出所有姓名中有军字的同学的学号、姓名、性别和专业;并执行验证。
USE?学生管理数据库
GO
CREATE?PROCEDURE?SNAME_S
@course varchar(50)
AS
??SELECT?学生信息表.学号,学生信息表.姓名,学生信息表.性别,学生信息表.专业
??FROM?学生信息表
??WHERE?学生信息表.姓名 like?@course
GO?
EXEC?SNAME_S?'%军%';
5.建立存储过程I_II,利用输出参数计算阶乘;并执行验证。
USE?学生管理数据库
GO
CREATE?PROCEDURE?I_II
??@SUM_I INT,
??@SUM_II FLOAT?OUTPUT
AS
??DECLARE?@X int,@Y float
??SET?@X=1
??SET?@Y=1
??WHILE?@X<=@SUM_I
??BEGIN
????SET?@Y=@Y*@X
????SET?@X=@X+1
??END
??SET??@SUM_II=@Y
GO
DECLARE?@OUTPUT FLOAT
EXEC?I_II?5,@OUTPUT OUTPUT
PRINT?STR(@OUTPUT)
二、游标操作
1.使用游标逐行提取学生信息表的记录。
USE?学生管理数据库
GO
DECLARE?SUM_I CURSOR
FOR?
??SELECT?*?FROM?学生信息表
OPEN?SUM_I
FETCH?NEXT?FROM?SUM_I
WHILE?@@FETCH_STATUS=0
????FETCH?NEXT?FROM?SUM_I
CLOSE?SUM_I
DEALLOCATE?SUM_I
USE?学生管理数据库
GO
DECLARE?SUM_I SCROLL?CURSOR
FOR?
??SELECT?*?FROM?学生信息表
OPEN?SUM_I
FETCH?ABSOLUTE?2 FROM?SUM_I
UPDATE?学生信息表
SET?姓名='刘雄狄'
WHERE?CURRENT?OF?SUM_I
CLOSE?SUM_I
DEALLOCATE?SUM_I
GO
SELECT?*?FROM?学生信息表
3.?创建一个课程信息表的临时表,删除该表的第3行记录;并查询表验证。
USE?学生管理数据库
GO
IF?OBJECT_ID('tempdb..#课程临时表')?is?not?null?
??DROP?TABLE?#课程临时表
SELECT?*?INTO?#课程临时表 FROM?课程信息表
SELECT?*?FROM?#课程临时表
SELECT?*?FROM?课程信息表
GO
DECLARE?SUM_I INSENSITIVE?SCROLL?CURSOR
FOR?
??SELECT?课程号 FROM?课程信息表
OPEN?SUM_I
FETCH?ABSOLUTE?3 FROM?SUM_I
DECLARE?@course varchar(50)
FETCH?ABSOLUTE?3 FROM?SUM_I INTO?@course
PRINT?@course
DELETE?FROM?#课程临时表
WHERE?课程号=@course
CLOSE?SUM_I
DEALLOCATE?SUM_I
GO
SELECT?*?FROM?#课程临时表
SELECT?*?FROM?课程信息表