1、 数据库中有教师表如下:数据库中有教师表如下:Teacher(TeaID,TeaName,TeaTitle,CourseNum)其中,其中,TeaTitle表示职称,表示职称,CourseNum表示本月课时数,表示本月课时数,请根据教师表,写程序完成教师工资的自动生成。工资表如请根据教师表,写程序完成教师工资的自动生成。工资表如下:下:Salary(TeaID,TeaName,Wage),其中其中Wage当月表示工当月表示工资。计算公式如下:资。计算公式如下:Wage=基本工资基本工资+课时费课时费基本工资:讲师(基本工资:讲师(1000),副教授(),副教授(1500),教授(),教授(20
2、00)课时费课时费=每课时工资每课时工资 课时数课时数每课时工资:讲师(每课时工资:讲师(80),副教授(),副教授(90),教授(),教授(100)TeaIDTeaNameTeaTitleCourseNum0001Mary讲师500002Tom教授400003Mike副教授40TeaIDTeaNameWage0001Mary50000002Tom60000003Mike5100第十章第十章 游标游标理解游标的概念理解游标的概念使用游标使用游标 在开发数据库应用程序时,经常需要使用在开发数据库应用程序时,经常需要使用SELECT语句语句查询数据库时,查询数据库时,查询返回的数据存放在结果集中。
3、用户在查询返回的数据存放在结果集中。用户在得到结果集后,需要逐行逐列的获取其中存储的数据,根据得到结果集后,需要逐行逐列的获取其中存储的数据,根据不同的值做不同的处理。这时候需要使用游标,不同的值做不同的处理。这时候需要使用游标,游标就是一游标就是一种定位并控制结果集的机制种定位并控制结果集的机制。1.游标是映射结果集并在结果集内的游标是映射结果集并在结果集内的单个行上建立一个位置单个行上建立一个位置的实体。的实体。2.有了游标,用户就可以访问结果集中的有了游标,用户就可以访问结果集中的任意一行任意一行数据了。数据了。3.在将游标放置到某行之后,可以在在将游标放置到某行之后,可以在该行或从该位
4、置开始的行块上执该行或从该位置开始的行块上执行操作行操作。4.最常见的操作是最常见的操作是提取(检索)当前行或行块提取(检索)当前行或行块。1.声明游标。声明游标。2.打开游标。打开游标。3.读取游标数据。读取游标数据。4.关闭游标。关闭游标。5.释放游标。释放游标。语法:语法:DECLARE 游标名称游标名称 CURSOR FOR select语句语句示例:声明一个游标,结果集为示例:声明一个游标,结果集为“Student”表中所有的男同学。表中所有的男同学。解决方案:解决方案:DECLARE curMaleStudent CURSOR FOR SELECT*FROM Student WHE
5、RE StuSex=男男语法:语法:OPEN 游标名称游标名称示例:打开上例中声明的游标示例:打开上例中声明的游标解决方案:解决方案:DECLARE curMaleStudent CURSOR FOR SELECT*FROM Student WHERE StuSex=男男OPEN curMaleStudent注:不能打开一个未被声明过的游标,否则编译器报错!已打开的游标注:不能打开一个未被声明过的游标,否则编译器报错!已打开的游标关闭之前不能再次打开,否则编译器也报错!关闭之前不能再次打开,否则编译器也报错!语法:语法:FETCH NEXT 游标名称游标名称 INTO 变量名变量名 ,.n 示
6、例:基于上例中声明的游标,读取第一行的数据。示例:基于上例中声明的游标,读取第一行的数据。解决方案:解决方案:DECLARE curMaleStudent CURSOR FOR SELECT*FROM Student WHERE StuSex=男男OPEN curMaleStudent FETCH NEXT FROM curMaleStudentFETCH_STATUS函数函数 返回被返回被 FETCH 语句执行的最后游标的状态。语句执行的最后游标的状态。返回值如下:返回值如下:0:FETCH 语句成功语句成功1:FETCH语句失败或此行不在结果集中语句失败或此行不在结果集中2:被提取的行不存
7、在:被提取的行不存在 示例:使用游标遍历示例:使用游标遍历“Student”表中的每一条记录。表中的每一条记录。解决方案:解决方案:DECLARE curMaleStudent CURSOR FOR SELECT*FROM Student WHERE StuSex=男男OPEN curMaleStudent FETCH NEXT FROM curMaleStudentWHILE FETCH_STATUS=0 FETCH NEXT FROM curMaleStudent 关闭游标语法:关闭游标语法:CLOSE 游标名称游标名称释放游标语法:释放游标语法:DEALLOCATE 游标名称游标名称注:
8、游标关闭并不代表注:游标关闭并不代表释放资源,释放前不能释放资源,释放前不能申明同名游标。申明同名游标。示例:使用游标遍历示例:使用游标遍历“Student”表中的每一条记录。表中的每一条记录。解决方案:解决方案:DECLARE curMaleStudent CURSOR FOR SELECT*FROM Student WHERE StuSex=男男OPEN curMaleStudent FETCH NEXT FROM curMaleStudentWHILE FETCH_STATUS=0 FETCH NEXT FROM curMaleStudent CLOSE curMaleStudent D
9、EALLOCATE curMaleStudent语法:语法:FETCH NEXT 游标名称游标名称 INTO 变量名变量名 ,.n 说明:该语句的使用必须和游标声明语句配合使用说明:该语句的使用必须和游标声明语句配合使用DECLARE 游标名称游标名称 CURSOR FOR select语句语句Select语句出现的字段必须与语句出现的字段必须与INTO后出现的变量名个数相等,且一一后出现的变量名个数相等,且一一对应对应使用游标遍历使用游标遍历Department表中的每个系的系名,然后把系名打印出来。表中的每个系的系名,然后把系名打印出来。DECLARE DepartmentName var
10、char(20)DECLARE curDepartment cursor for SELECT DepName FROM DepartmentOPEN curDepartmentFETCH curDepartment into DepartmentNameWhile(fetch_status=0)BEGINPrint Department Name=+DepartmentNameFETCH curDepartment into DepartmentNameENDCLOSE curDepartmentDEALLOCATE curDepartment游标一般创建在存储过程中使用游标一般创建在存储过
11、程中使用使用游标完成教师工资的生成使用游标完成教师工资的生成DECLARE TeaID char(10)-用于存放教师工号用于存放教师工号DECLARE TeaTitle varchar(20)-用于存放教师职称用于存放教师职称DECLARE CourseNum int-用于存放教师本月课时数用于存放教师本月课时数DECLARE Wage decimal-用于存放本月工资用于存放本月工资DECLARE curTeacherWage CURSOR FOR SELECT TeaID,TeaTitle,CourseNum FROM TeacherOPEN curTeacherWage -声明游标指向
12、教师表声明游标指向教师表-将游标当前指向的行的将游标当前指向的行的TeaID、TeaTitle、CourseNum字段值赋给变量保字段值赋给变量保存存FETCH curTeacherWage INTO TeaID,TeaTitle,CourseNum WHILE(FETCH_STATUS=0)BEGIN-根据教师的职称及课时数,计算工资,保存变量根据教师的职称及课时数,计算工资,保存变量WageIF(TeaTitle=讲师讲师)SET Wage=1000+80*CourseNumELSE IF(TeaTitle=副教授副教授)SET Wage=1500+90*CourseNumELSESET
13、Wage=2000+100*CourseNumINSERT INTO Salary VALUES(TeaID,Wage)-插入当前教师的工资插入当前教师的工资FETCH curTeacherWage INTO TeaID,TeaTitle,CourseNumENDCLOSE curTeacherWageDEALLOCATE curTeacherWage有学生表和系表,游标有学生表和系表,游标1先找出系表中的每个系,对于找到的系,再使用游标先找出系表中的每个系,对于找到的系,再使用游标2找出该系的所有学生的信息。找出该系的所有学生的信息。语法:语法:declare cursor_name1 fo
14、ropen cursor_name1fetch cursor_name1While(fetch_status=0)begin declare cursor_name2 foropen cursor_name2fetch cursor_name2while(fetch_status=0)close cursor_name2deallocate cursor_name2fetch cursor_name1endclose cursor_name1deallocate cursor_name1有学生表和系表,使用嵌套游标,游标有学生表和系表,使用嵌套游标,游标1先找出系表中的每个系,对于先找出系表中
15、的每个系,对于找到的系,再使用游标找到的系,再使用游标2找出该系的所有学生的信息。找出该系的所有学生的信息。有学生表和系表,使用嵌套游标,游标有学生表和系表,使用嵌套游标,游标1先找出系表中的每个系,对于先找出系表中的每个系,对于找到的系,再使用游标找到的系,再使用游标2找出该系的所有学生的信息。找出该系的所有学生的信息。declare DepID intdeclare curDepartment cursor for select DepID from departmentopen curDepartmentfetch curDepartment into DepIDWhile(fetch_status=0)begin declare curStudent cursor for select*from student where DepID=DepIDopen curStudentfetch curStudentwhile(fetch_status=0)fetch curStudentclose curStudentdeallocate curStudentfetch curDepartment into DepIDendclose curDepartmentdeallocate curDepartment