1、实验 12 存储过程和游标的使用一、实验目的1. 理解存储过程的概念,掌握各种存储过程的创建方法。2. 掌握查看、修改和删除存储过程的方法。3. 掌握执行存储过程的方法。4 掌握游标的创建和使用。二、实验内容从查询分析器中导入实验文件夹中的“实验初始化数据.sql ”文件并运行,然后完成下面题目:(提示:学生表(Students):属性:学号(Sno) ,姓名(Sname) ,性别(Ssex) ,系别(Sdept) ,年龄(Sage) 。其中学号设为主键,学号和姓名不能为空,性别取值只能是 F 或 M,系别缺省值为“计算机” 。选课信息表(Enrollment) 。属性:学号(Sno) ,课程
2、名(Cno ) ,成绩(Grade ) 。其中课程号设为主键,课程号和课程名不能为空.。课程信息表(Course) 。属性:课程号(Cno ) ,课程名称(Cname) ,学分(Credits) 。 )1 存储过程的创建和使用。(1)、创建一个名为“proc_1” 的存储过程,用于查看学生表的所有信息。然后调用该存储过程。SQL 语句如下:USE SCinfoGOCREATE PROCEDURE proc_1AS SELECT *FROM Students(2)、创建一个名为“proc_2” 的存储过程,用于向学生表的所有字段添加一条记录,记录内容由调用时决定。然后调用该存储过程输入一条记录(
3、1111,关羽,M,English,30 )。SQL 语句如下:USE SCinfoGOCREATE PROCEDURE proc_2 Sno SMALLINT,Sname VARCHAR(8),Ssex CHAR(1),Sdept VARCHAR(20),Sage TINYINT AS INSERT INTO StudentsVALUES(Sno,Sname,Ssex,Sdept,Sage)GOEXEC proc_2 1111,关羽 ,F,English,30 GO(3)、创建一个名为“proc_3” 的存储过程,用于删除学生表中指定学号的记录,具体学号由调用时决定。然后调用该存储过程将学号
4、为 1111 的记录删除。SQL 语句如下:USE SCinfoGOCREATE PROCEDURE proc_3 Sno SMALLINTAS DELETE FROM StudentsWHERE Sno = SnoGOEXEC proc_3 1111GO(4)、修改存储过程“proc_3” ,用于查询不小于指定年龄的学生的基本信息,具体年龄由调用时决定。然后调用存储过程 proc_3 查询年龄小于 20 岁的学生记录。SQL 语句如下:USE SCinfoGOALTER PROCEDURE proc_3 Sage TINYINTAS SELECT * FROM StudentsWHERE S
5、age SageGOEXEC proc_3 20GO2.游标的创建和使用(1)定义一个游标 STU1 并利用游标逐行输出学生表(Students)中学生的学号、姓名、性别,使用完游标后立即关闭并释放该游标。SQL 语句如下:DECLARE STU1 CURSOR -定义游标FOR SELECT Sno,Sname,Ssex FROM StudentsOPEN STU1 -打开游标DECLARE Sno smallint ,Sname varchar(8),Ssex char(1) -定义变量FETCH NEXT FROM STU1 INTO Sno ,Sname,Ssex -获取一行值WHIL
6、E FETCH_STATUS = 0BEGINSELECT 学号=Sno, 姓名= Sname, 性别:= SsexFETCH NEXT FROM STU1 INTO Sno ,Sname,Ssex -从游标读取下一行值ENDCLOSE STU1 -关闭游标DEALLOCATE STU1 -释放游标(2)定义一个游标 STU2 并利用该游标输出学生表(Students)中第一个学生的所有信息,然后将该学生姓名改为张飞,并再次输入该学生信息,使用完游标后立即关闭并释放该游标。SQL 语句如下:DECLARE STU2 SCROLL CURSOR -定义游标FOR SELECT * FROM St
7、udentsFOR UPDATE OF Sno ,Sname,Ssex,Sdept,SageOPEN STU2 -打开游标DECLARE Sno smallint ,Sname varchar(8),Ssex char(1),Sdept varchar(20),Sage tinyint -定义变量FETCH NEXT FROM STU2 INTO Sno ,Sname,Ssex,Sdept,Sage -获取第一行值SELECT 学号=Sno, 姓名 = Sname, 性别:= Ssex,系别=Sdept ,年龄=SageUPDATE Students -将当前行记录修改SET Sname =
8、张飞WHERE CURRENT OF STU2CLOSE STU2 -关闭游标DEALLOCATE STU2 -释放游标(3)定义一个游标 STU3 并利用该游标删除学生表(Students)中的最后一条记录,使用完游标后立即关闭并释放该游标。SQL 语句如下:DECLARE STU3 SCROLL CURSOR -定义游标FOR SELECT * FROM StudentsOPEN STU3 -打开游标FETCH LAST FROM STU3 -获取最后一行记录DELETE FROM STUDENTS -删除最后一行记录WHERE CURRENT OF STU3CLOSE STU3 -关闭游标DEALLOCATE STU3 -释放游标