《高级数据库》课程教学课件(讲稿)Chapter 4 游标

Chapter4游标4.1游标概念在数据库开发过程中,我们经常会遇到这样的情况,即从一结果集中逐一地读取一条记录。那么如何解决这种问题呢?游标为我们提供了一种极为优秀的解决方案。游标是数据库中一个十分重要的概念。SQLServer通过游标提供了对一个结果集进行逐行处理的能力,游标可以看作一种特殊的指针,它与某个查询结果相联系,可以指向结果集的任意位置,以便对指定位置的数据进行处理。每一个游标(CURSOR)必须按照以下五个步骤来使用:(1)DECLARE声明游标(2)OPEN打开游标(3)从一个游标中FETCH读取数据,对信息进行处理(4)CLOSE关闭游标(5)DEALLOCATE释放游标4.1.1声明游标语法格式:DECLAREcursornameCURSOR[LOCAL|GLOBAL]/*游标作用域*/[FORWARD ONLYSCROLL]/*游标移动方向*/[STATIC|KEYSET|DYNAMIC|FAST FORWARD]/*游标类型*//*访问属性*/[READ ONLYSCROLL LOCKS|OPTIMISTIC][TYPE WARNING]/*类型转换警告信息*/FOR select_statement/*SELECT查询语句*/[FORUPDATE[OFcolumn_name[-n]]]/*可修改的列*/参数说明:图LOCAL和GLOBAL选项:分别说明DECLARECURSOR语句所声明的游标为局部游标和全局游标,默认为全局游标。-FORWARD_ONLY和SCROLL选项:说明游标的移动方向。FORWARD_ONLY声明只进游标,只能从第一行滚动到最后一行,即FETCH语句中只能使用NEXT选项。SCROLL声明的游标可以前滚、后滚,可以使用所有的FETCH选项(FIRST、LASTPRIORNEXT、RELATIVE、ABSOLUTE)-STATIC和DYNAMIC和FAST_FORWARD选项:用于定义游标的类型。STATIC将游标声明为静态游标,禁止应用程序通过它修改基表数据,·。DYNAMIC将游标声明为动态游标,也就是说,其结果结合是动态变化的,能够随时反映用户已提交的更改结果。提取动态游标数据时,不能使用ABSOLUTE提取选项定位游标指针:
Chapter 4 游标 4.1 游标概念 在数据库开发过程中,我们经常会遇到这样的情况,即从一结果集中逐一地读取一条记 录。那么如何解决这种问题呢?游标为我们提供了一种极为优秀的解决方案。 游标是数据库中一个十分重要的概念。SQL Server 通过游标提供了对一个结果集进行逐 行处理的能力,游标可以看作一种特殊的指针,它与某个查询结果相联系,可以指向结果集 的任意位置,以便对指定位置的数据进行处理。 每一个游标(CURSOR)必须按照以下五个步骤来使用: (1)DECLARE 声明游标 (2)OPEN 打开游标 (3)从一个游标中 FETCH 读取数据,对信息进行处理 (4)CLOSE 关闭游标 (5)DEALLOCATE 释放游标 声明游标 语法格式: DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] /*游标作用域*/ [ FORWARD_ONLY | SCROLL ] /*游标移动方向*/ [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] /*游标类型*/ [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] /*访问属性*/ [ TYPE_WARNING ] /*类型转换警告信息*/ FOR select_statement /*SELECT 查询语句*/ [ FOR UPDATE [ OF column_name [ ,.n ] ] ] /*可修改的列*/ 参数说明: ◼ LOCAL 和 GLOBAL 选项:分别说明 DECLARE CURSOR 语句所声明的游标为局部游 标和全局游标,默认为全局游标。 ◼ FORWARD_ONLY 和 SCROLL 选项:说明游标的移动方向。FORWARD_ONLY 声明只 进游标,只能从第一行滚动到最后一行,即 FETCH 语句中只能使用 NEXT 选项。 SCROLL 声明的游标可以前滚、后滚,可以使用所有的 FETCH 选项(FIRST、LAST、 PRIOR、NEXT、RELATIVE、ABSOLUTE)。 ◼ STATIC 和 DYNAMIC 和 FAST_FORWARD 选项:用于定义游标的类型。 ⚫ STATIC 将游标声明为静态游标,禁止应用程序通过它修改基表数据; ⚫ DYNAMIC 将游标声明为动态游标,也就是说,其结果结合是动态变化的,能够随 时反映用户已提交的更改结果。提取动态游标数据时,不能使用 ABSOLUTE 提取 选项定位游标指针;

FASTFORWARD将游标声明为快速只进游标,它是优化的只进游标,只支持游标从头到尾顺序提取数据,因此不能与SCROLL一同使用,且与FORWARDONLY只需选用一个。READONLY和SCROLLLOCKS和OPTIMISTIC选项:说明游标或基表的访问属性。READ_ONLY说明游标为只读不可修改的。·SCROLLLOCKS选项要求SQLServer在将数据读入游标的同时锁定基表中的数据行,以确保以后能够通过游标成功地对基表进行定位删除和修改操作。OPTIMISTIC说明在填充游标时不锁定基表中的数据行。·FORselect_statement:SELECT查询语句,由该查询产生与所声明的游标关联的结果集。-FORUPDATE:定义游标内可更新的列。如果提供了OFcolumnname【,"n],则只允V许修改列出的列。若未指定列,除非指定了READONLY选项,否则所有列均可更新。4.1.2打开游标声明游标后,要使用游标从中提取数据,就必须使用OPEN语句先打开游标。其格式为:OPEN([GLOBAL]cursor_name|cursor_variable_nameOPEN语句打开游标,然后通过执行在DECLARECURSOR(或SETcursor_variable)语句中指定的SELECT语句来填充游标(即生成与游标相关联的结果集)。打开游标后,可以使用全局变量@@CURSORROWS查看游标中数据行的数目。表1.@@CURSORROWS返回值说明返回值描述-m表示正在向游标中载入数据,反映的是结果集当前的数据行数表示该游标是一个动态游标,由于动态游标反映基础表的所有变化,因此符合-1游标定义的数据行经常变动,故无法确定0表示无符合条件的记录或游标已关闭m表示从基础表读入数据已经结束,n即为游标中结果集的行数【例】声明一个只进、动态游标cur1,打开该游标,并输出其行数DECLARE CUr1 CURSORFORWARD ONLYDYNAMICFORSELECT*FROMXSEOPEN cur_1--查看游标内的数据行数:结果值为-1,说明是动态游标SELECT @QCURSOR ROWS
⚫ FAST_FORWARD 将游标声明为快速只进游标,它是优化的只进游标,只支持游标 从头到尾顺序提取数据,因此不能与 SCROLL 一同使用,且与 FORWARD_ONLY 只需选用一个。 ◼ READ_ONLY 和 SCROLL_LOCKS 和 OPTIMISTIC 选项:说明游标或基表的访问属性。 ⚫ READ_ONLY 说明游标为只读不可修改的。 ⚫ SCROLL_LOCKS 选项要求 SQL Server 在将数据读入游标的同时锁定基表中的数 据行,以确保以后能够通过游标成功地对基表进行定位删除和修改操作。 ⚫ OPTIMISTIC 说明在填充游标时不锁定基表中的数据行。 ◼ FOR select_statement:SELECT 查询语句,由该查询产生与所声明的游标关联的结果集。 ◼ FOR UPDATE:定义游标内可更新的列。如果提供了 OF column_name [ ,.n ],则只允 许修改列出的列。若未指定列,除非指定了 READ_ONLY 选项,否则所有列均可更新。 打开游标 声明游标后,要使用游标从中提取数据,就必须使用 OPEN 语句先打开游标。 其格式为: OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name } OPEN 语句打开游标,然后通过执行在 DECLARE CURSOR(或 SET cursor_variable) 语句中指定的 SELECT 语句来填充游标(即生成与游标相关联的结果集)。 打开游标后,可以使用全局变量@@CURSOR_ROWS 查看游标中数据行的数目。 表 1. @@CURSOR_ROWS 返回值说明 返回值 描 述 -m 表示正在向游标中载入数据,反映的是结果集当前的数据行数 -1 表示该游标是一个动态游标,由于动态游标反映基础表的所有变化,因此符合 游标定义的数据行经常变动,故无法确定 0 表示无符合条件的记录或游标已关闭 m 表示从基础表读入数据已经结束,n 即为游标中结果集的行数 【例】声明一个只进、动态游标 cur_1,打开该游标,并输出其行数 DECLARE cur_1 CURSOR FORWARD_ONLY DYNAMIC FOR SELECT * FROM XSB OPEN cur_1 -查看游标内的数据行数:结果值为-1,说明是动态游标 SELECT @@CURSOR_ROWS

【例】声明一个滚动、静态游标cur2,打开该游标,并输出其行数DECLARE Cur 2 CURSORSCROLLSTATICFOR SELECT* FROM XSBOPENcur2--查看游标内的数据行数:结果值为22,说明从结果集中读取数据结束,行数为22SELECT @@CURSOR ROWS4.1.3读取游标数据游标打开后,就可以使用FETCH语句从中读取数据了。其语法格式FETCH[[NEXT|PRIOR|FIRSTLAST[ABSOLUTE(n|@nvar|RELATIVE(n|@nvar)JFROM]([GLOBAL]cursor_name|@cursor_variable_name】[INTO@variable_name[...n]]参数说明:NEXT说明如果是在OPEN后第一次执行FETCH命令,则返回结果集的第一行,否则编使游标(指针)指向结果集的下一行;NEXT是默认的选项,也是最常用的一种方法PRIOR、FIRST、LAST、ABSOLUTE(n@nvar)、RELATIVE(n|@nvar)等各项,只有在定义游标时使用了SCROLL选项才可以使用。·PRIOR是返回结果集当前行的前一行;如果FETCHPRIOR是第一次读取游标中数据,则无数据记录返回,并把游标位置设为第一行。FIRST是返回结果集的第一行;LAST是返回结果集的最后一行ABSOLUTE(n|@nvar)若n或@nvar为正数,则返回游标结果集中的第n或@nvar行数据。若n或@nvar为负数,则返回结果集内倒数第n或@nvar行数据。RELATIVE(n|@nvar)若n或@nvar为正数,则读取游标当前位置起向后的第n或@nvar行数据,若n或@nvar为负数,则读取游标当前位置起向前的第n或@nvar行数据。1INTO说明将读取的游标数据存放到指定的变量中。FETCH语句的执行状态保存在全局变量@@FETCHSTATUS中。表2.@@FETCHSTATUS返回值说明返回值描述0FETCH命令被成功执行。-1FETCH命令失败或所指定的范围超出了范围。-2要取的行不在记录集内,已从集合中删除
【例】声明一个滚动、静态游标 cur_2,打开该游标,并输出其行数 DECLARE cur_2 CURSOR SCROLL STATIC FOR SELECT * FROM XSB OPEN cur_2 -查看游标内的数据行数:结果值为22,说明从结果集中读取数据结束,行数为22 SELECT @@CURSOR_ROWS 读取游标数据 游标打开后,就可以使用 FETCH 语句从中读取数据了。其语法格式: FETCH [ [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar} ] FROM ] { { [ GLOBAL ] cursor_name } | @cursor_variable_name } [ INTO @variable_name [ ,.n ] ] 参数说明: ◼ NEXT 说明如果是在 OPEN 后第一次执行 FETCH 命令,则返回结果集的第一行,否则 使游标(指针)指向结果集的下一行;NEXT 是默认的选项,也是最常用的一种方法 ◼ PRIOR、FIRST、LAST、ABSOLUTE { n|@nvar}、RELATIVE { n|@nvar}等各项,只有 在定义游标时使用了 SCROLL 选项才可以使用。 ⚫ PRIOR 是返回结果集当前行的前一行;如果 FETCH PRIOR 是第一次读取游标中 数据,则无数据记录返回,并把游标位置设为第一行。 ⚫ FIRST 是返回结果集的第一行; ⚫ LAST 是返回结果集的最后一行; ⚫ ABSOLUTE {n | @nvar} 若 n 或@nvar 为正数,则返回游标结果集中的第 n 或@nvar 行数据。若 n 或@nvar 为负数,则返回结果集内倒数第 n 或@nvar 行数据。 ⚫ RELATIVE {n | @nvar} 若 n 或@nvar 为正数,则读取游标当前位置起向后的第 n 或@nvar 行数据;若 n 或@nvar 为负数,则读取游标当前位置起向前的第 n 或@nvar 行数据。 ◼ INTO 说明将读取的游标数据存放到指定的变量中。 FETCH 语句的执行状态保存在全局变量@@FETCH_STATUS 中。 表 2. @@FETCH_STATUS 返回值说明 返回值 描 述 0 FETCH 命令被成功执行。 -1 FETCH 命令失败或所指定的范围超出了范围。 -2 要取的行不在记录集内,已从集合中删除

【例】上例中的游标cur1和cur_2已打开,使用FETCH命令提取数据。FETCHNEXTFROMCur1--OPEN后第一次执行FETCH NEXT,读取游标的第一行数据SELECT @QFETCHSTATUS--返回值为,表示FETCH命令执行成功FETCH PRIOR FROM Cur1FETCH FIRST FROM Cur1FETCH LAST FROM Cur1--只进游标不能使用FIRST\LAST\PRIOR\ABSOLUTE\RELATIVE等选项SELECT @@FETCH STATUS-返回值为-1,表示FETCH命令执行失败FETCH NEXT FROM Cur2--OPEN后第一次执行FETCHNEXT,读取游标的第一行数据FETCHPRIORFROM Cur2--读取游标的前一行数据FETCH FIRST FROM Cur 2--读取游标的第一行数据FETCH LAST FROM Cur 2--读取游标的最后一行数据FETCH ABSOLUTE5 FROMCUr2--读取游标的第行数据FETCHRELATIVE5 FROMCur_2--读取游标当前位置向后第五行数据FETCHRELATIVE-5FROMCur_2--读取游标当前位置向前第五行数据-FIRSTILAST\PRIOR\ABSOLUTE\RELATIVE等选项只有SCROLL游标可以使用SELECT@FETCHSTATUS--返回值为O,表示FETCH命令执行成功4.1.4关闭游标游标使用完以后要及时关闭。关闭游标使用CLOSE语句,格式为:CLOSE[GLOBALcursorname|@cursor_variablename注意:CLOSE语句关闭游标,但不释放游标占用的数据结构,应用程序可以再次执行OPEN语句打开并填充游标。4.1.5释放游标当使用CLOSE命令关闭游标后,其定义仍在,需要时可用OPEN语句打开它再使用。若确认游标不再需要,就要释放其定义占用的系统空间,即释放游标。释放游标使用DEALLOCATE语句,格式为:DEALLOCATE[GLOBAL]cursorname|@cursor_variable_name4.1.6游标定位修改和删除游标定位修改UPDATE语句的格式如下:UPDATE表名SET子句WHERECURRENTOF(([GLOBAL】游标名】游标变量)游标定位删除DELETE语句的格式为如下DELETEFROM表名WHERECURRENTOF[GLOBAL]游标名】游标变量】
【例】上例中的游标 cur_1 和 cur_2 已打开,使用 FETCH 命令提取数据。 FETCH NEXT FROM cur_1 -OPEN后第一次执行FETCH NEXT,读取游标的第一行数据 SELECT @@FETCH_STATUS -返回值为,表示FETCH命令执行成功 FETCH PRIOR FROM cur_1 FETCH FIRST FROM cur_1 FETCH LAST FROM cur_1 -只进游标不能使用FIRST\LAST\PRIOR\ABSOLUTE\RELATIVE等选项 SELECT @@FETCH_STATUS -返回值为-1,表示FETCH命令执行失败 FETCH NEXT FROM cur_2 -OPEN后第一次执行FETCH NEXT,读取游标的第一行数据 FETCH PRIOR FROM cur_2 -读取游标的前一行数据 FETCH FIRST FROM cur_2 -读取游标的第一行数据 FETCH LAST FROM cur_2 -读取游标的最后一行数据 FETCH ABSOLUTE 5 FROM cur_2 -读取游标的第行数据 FETCH RELATIVE 5 FROM cur_2 -读取游标当前位置向后第五行数据 FETCH RELATIVE -5 FROM cur_2 -读取游标当前位置向前第五行数据 -FIRST\LAST\PRIOR\ABSOLUTE\RELATIVE等选项只有SCROLL游标可以使用 SELECT @@FETCH_STATUS -返回值为 0,表示 FETCH 命令执行成功 关闭游标 游标使用完以后要及时关闭。关闭游标使用 CLOSE 语句,格式为: CLOSE { { [ GLOBAL ] cursor_name } | @cursor_variable_name } 注意:CLOSE 语句关闭游标,但不释放游标占用的数据结构,应用程序可以再次执行 OPEN 语句打开并填充游标。 释放游标 当使用 CLOSE 命令关闭游标后,其定义仍在,需要时可用 OPEN 语句打开它再使用。 若确认游标不再需要,就要释放其定义占用的系统空间,即释放游标。释放游标使用 DEALLOCATE 语句,格式为: DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name } 游标定位修改和删除 游标定位修改 UPDATE 语句的格式如下: UPDATE 表名 SET 子句 WHERE CURRENT OF {{[GLOBAL] 游标名}|游标变量} 游标定位删除 DELETE 语句的格式为如下: DELETE FROM 表名 WHERE CURRENT OF {{[GLOBAL] 游标名}|游标变量}

4.2游标实例分析【例4-1】使用游标CUR1逐行输出学生表XSB中的学号、姓名和总学分。DECLARE @id char(6)@name char(8),@xf int--声明一个包含学号\姓名\总学分的游标cur1DECLARE Cur 1 CURSORFORSELECTXSB.学号,XSB.姓名,XSB.总学分FROMXSB--打开游标OPEN cur1--读取游标第一行数据,并赋值给变量FETCH NEXT FROM cur 1 into @id,@name,@xf--利用WHILE循环,逐行输出游标读取的数据,并取下一行数据WHILE @@FETCH STATUS-OBEGINPRINT@id+!I+@name+!总学分:+CAsT(@xfaschar(2))FETCH NEXT FROM cur1 into @id,@name,@xfEND关闭游标-CLOSE cur_1--释放游标DEALLOCATE Cur1【例4-2]在学生表XSB中增加一列"平均成绩",使用游标进行数据填充。一声明一个逐行读取XSB学号的游标DECLARE @id char(6)@aver intDECLARE CUY 2 CURSORFOR SELECT XSB.学号 FROMXSBOPEN cur 2FETCH NEXT FROM cur_2 into @idWHILE @@FETCH STATUS-OBEGIN--根据@id使用AVG聚合函数在CJB中计算平均成绩SET @aVer=(SELECT AVG(CJB.成绩) FROM CJB WHERE CJB.学号-@id)--UPDATEXSB中的平均成绩UPDATE XSBSETXSB.平均成绩-@averWHEREXSB.学号-@id--读取下一行数据FETCH NEXT FROMcur2into @idENDCLOSE cur 2DEALLOCATE Cur 2SELECT * FROM XSB
4.2 游标实例分析 【例 4-1】使用游标 CUR_1 逐行输出学生表 XSB 中的学号、姓名和总学分。 DECLARE @id char(6),@name char(8),@xf int -声明一个包含学号\姓名\总学分的游标cur_1 DECLARE cur_1 CURSOR FOR SELECT XSB.学号,XSB.姓名,XSB.总学分 FROM XSB -打开游标 OPEN cur_1 -读取游标第一行数据,并赋值给变量 FETCH NEXT FROM cur_1 into @id,@name,@xf -利用WHILE循环,逐行输出游标读取的数据,并取下一行数据 WHILE @@FETCH_STATUS=0 BEGIN PRINT @id+' '+@name+' 总学分:'+CAST(@xf as char(2)) FETCH NEXT FROM cur_1 into @id,@name,@xf END -关闭游标 CLOSE cur_1 -释放游标 DEALLOCATE cur_1 【例 4-2】在学生表 XSB 中增加一列“平均成绩”,使用游标进行数据填充。 -声明一个逐行读取XSB学号的游标 DECLARE @id char(6),@aver int DECLARE cur_2 CURSOR FOR SELECT XSB.学号 FROM XSB OPEN cur_2 FETCH NEXT FROM cur_2 into @id WHILE @@FETCH_STATUS=0 BEGIN -根据@id使用AVG聚合函数在CJB中计算平均成绩 SET @aver=(SELECT AVG(CJB.成绩) FROM CJB WHERE CJB.学号=@id) -UPDATE XSB中的平均成绩 UPDATE XSB SET XSB.平均成绩=@aver WHERE XSB.学号=@id -读取下一行数据 FETCH NEXT FROM cur_2 into @id END CLOSE cur_2 DEALLOCATE cur_2 SELECT * FROM XSB

消息【例4-3】设计嵌套游标,外层游标显示每081101王林计算机基础80101个学生的学号、姓名,内层游标显示当前学78102程序设计与语言206离散数学76生所选修的课程情况,包括课程编号、课程程明081102程序设计与语言78102名称及成绩,效果如右图。离散数学20678王燕081103计算机基础62101程序102设计与语言70206离散数学81韦严平081104计算机基础90101程序设计与语言10284206离散数学65李方方081106计算机基础65101程序设计与语言71102离散数学80206DECLARE@idchar(6),@namechar(8)DECLARE @cid char(3),@cname char(20),@cj intDECLARE Cur 1 CURSORFORSELECTXSB.学号,XSB.姓名FROMXSBOPEN cur 1FETCH NEXT FROM cur 1 INTO @id,@nameWHILE@@FETCHSTATUS-OBEGINPRINT @id+! I+@name--设计内层游标,根据@id输出选修课程情况DECLARE Cur 2 CURSORFORSELECTCJB.课程编号,KCB.课程名称,CJB.成绩FROM KCB,CJBWHEREKCB.课程编号=CJB.课程编号ANDCJB.学号-@idOPEN cur 2FETCH NEXT FROM cur 2 INTO @cid,@cname,@cjWHILE @@FETCH STATUS=OBEGINPRINT1+@cid+/+@cname+CAST(@cj AS CHAR(2))FETCH NEXT FROM cur2INTO @cid,@cname,@cjENDCLOSE cur 2DEALLOCATE Cur 2FETCH NEXT FROM cur 1 INTO @id,@nameENDCLOSE Cur_1DEALLOCATE Cur1
【例 4-3】设计嵌套游标,外层游标显示每 个学生的学号、姓名,内层游标显示当前学 生所选修的课程情况,包括课程编号、课程 名称及成绩,效果如右图。 DECLARE @id char(6),@name char(8) DECLARE @cid char(3),@cname char(20),@cj int DECLARE cur_1 CURSOR FOR SELECT XSB.学号,XSB.姓名 FROM XSB OPEN cur_1 FETCH NEXT FROM cur_1 INTO @id,@name WHILE @@FETCH_STATUS=0 BEGIN PRINT @id+' '+@name -设计内层游标,根据@id输出选修课程情况 DECLARE cur_2 CURSOR FOR SELECT CJB.课程编号,KCB.课程名称,CJB.成绩 FROM KCB,CJB WHERE KCB.课程编号=CJB.课程编号 AND CJB.学号=@id OPEN cur_2 FETCH NEXT FROM cur_2 INTO @cid,@cname,@cj WHILE @@FETCH_STATUS=0 BEGIN PRINT ' '+@cid+' '+@cname+CAST(@cj AS CHAR(2)) FETCH NEXT FROM cur_2 INTO @cid,@cname,@cj END CLOSE cur_2 DEALLOCATE cur_2 FETCH NEXT FROM cur_1 INTO @id,@name END CLOSE cur_1 DEALLOCATE cur_1

消息【例4-4】显示学生的学号、姓名、累计学081101王林累计学分:14分(成绩大于60分的课程学分累计情况)程明累计学分:8081102王燕累计学分:9081103韦能平A累计效果如右图。081104分:5李方方累计学分:0811057累计学081106李明分:8一帆累计081107林学分:0累计铁081108张强民分:5影累计081109张蔚分:3累计081110赵琳分:4累计学分!严红3081111081201王敏累计学分:8王林累计学分:5081202DECLARE @id char(6)@name char(8DECLARE @xf int,@sum intDECLARE Cur1CURSORFORSELECTXSB.学号,XSB.姓名FROMXSBOPEN cur 1FETCH NEXT FROM cur 1 INTO @id,@nameWHILE@@FETCH STATUS-0BEGIN--设计内层游标,根据@id读取该生选修课程及格的学分,做累加SET @Sum=0DECLARECur_2CURSORFOR SELECTKCB.学分FROM KCB,CJBWHEREKCB.课程编号-CJB.课程编号AND CJB.学号-@idANDCJB.成绩>=60OPEN cur 2FETCH NEXT FROM cur 2 into @xfWHILE @@FETCH STATUS=OBEGINSET @sum+=@xfFETCH NEXT FROM cur 2 into @xfENDCLOSE cur 2DEALLOCATE Cur 2PRINT @id++@name+累计学分:+CAST(@sumas char(2))FETCH NEXT FROM cur 1 INTO @id,@nameENDCLOSE cur 1DEALLOCATECuY1
【例 4-4】显示学生的学号、姓名、累计学 分(成绩大于 60 分的课程学分累计情况), 效果如右图。 DECLARE @id char(6),@name char(8) DECLARE @xf int,@sum int DECLARE cur_1 CURSOR FOR SELECT XSB.学号,XSB.姓名 FROM XSB OPEN cur_1 FETCH NEXT FROM cur_1 INTO @id,@name WHILE @@FETCH_STATUS=0 BEGIN -设计内层游标,根据@id读取该生选修课程及格的学分,做累加 SET @sum=0 DECLARE cur_2 CURSOR FOR SELECT KCB.学分 FROM KCB,CJB WHERE KCB.课程编号=CJB.课程编号 AND CJB.学号=@id AND CJB.成绩>=60 OPEN cur_2 FETCH NEXT FROM cur_2 into @xf WHILE @@FETCH_STATUS=0 BEGIN SET @sum+=@xf FETCH NEXT FROM cur_2 into @xf END CLOSE cur_2 DEALLOCATE cur_2 PRINT @id+' '+@name+'累计学分:'+CAST(@sum as char(2)) FETCH NEXT FROM cur_1 INTO @id,@name END CLOSE cur_1 DEALLOCATE cur_1
按次数下载不扣除下载券;
注册用户24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
- 《高级数据库》课程教学课件(讲稿)Chapter 3 T-SQL语言编程.pdf
- 《高级数据库》课程教学课件(讲稿)Chapter 2 SQL Server基本操作.pdf
- 《高级数据库》课程教学课件(讲稿)Chapter 1 数据库基本概念.pdf
- 《Linux操作系统》课程教学课件(PPT讲稿)ch10 高级文件处理.ppt
- 《Linux操作系统》课程教学课件(PPT讲稿)ch9 基本文件处理.ppt
- 《Linux操作系统》课程教学课件(PPT讲稿)ch8 文件安全.ppt
- 《Linux操作系统》课程教学课件(PPT讲稿)ch7 文件和文件系统结构.ppt
- 《Linux操作系统》课程教学课件(PPT讲稿)ch5 编辑文本文件.ppt
- 《Linux操作系统》课程教学课件(PPT讲稿)ch4 Linux shell.ppt
- 《Linux操作系统》课程教学课件(PPT讲稿)ch3 开始行动.ppt
- 《Linux操作系统》课程教学课件(PPT讲稿)ch2 linux概述.ppt
- 烟台大学:《大学计算机基础》课程教学课件(理论讲稿)第11章 计算机发展前沿技术.pdf
- 烟台大学:《大学计算机基础》课程教学课件(理论讲稿)第10章 问题求解的算法基础与程序设计.pdf
- 烟台大学:《大学计算机基础》课程教学课件(理论讲稿)第9章 信息社会与安全.pdf
- 烟台大学:《大学计算机基础》课程教学课件(理论讲稿)第8章 多媒体技术基础.pdf
- 烟台大学:《大学计算机基础》课程教学课件(理论讲稿)第7章 计算机网络基础.pdf
- 烟台大学:《大学计算机基础》课程教学课件(理论讲稿)第6章 数据库技术基础.pdf
- 烟台大学:《大学计算机基础》课程教学课件(理论讲稿)第5章 办公软件 5.4演示文稿软件.pdf
- 烟台大学:《大学计算机基础》课程教学课件(理论讲稿)第5章 办公软件 5.3电子表格软件.pdf
- 烟台大学:《大学计算机基础》课程教学课件(理论讲稿)第5章 办公软件 5.1-5.2文字处理软件.pdf
- 《高级数据库》课程教学课件(讲稿)Chapter 6 存储过程.pdf
- 《高级数据库》课程教学课件(讲稿)Chapter 7 触发器.pdf
- 《Java面向对象程序设计》课程教学资源(书籍文献)Java编程思想【美】Bruce Eckel,Thinking In Java(中文版).pdf
- 《Java面向对象程序设计》课程教学资源(PPT课件)第1章 Java语言概述(第6版).pptx
- 《Java面向对象程序设计》课程教学资源(PPT课件)第2章 Java语言开发环境(第6版).pptx
- 《Java面向对象程序设计》课程教学资源(书籍文献)Java项目开发全程实录(第三版).pdf
- 《Java面向对象程序设计》课程教学资源(PPT课件)第3章 Java语言基础(第6版).pptx
- 《Java面向对象程序设计》课程教学资源(书籍文献)Java语言程序设计-进阶篇(原书第8版,梁勇,扫描版).pdf
- 《Java面向对象程序设计》课程教学资源(书籍文献)Java语言程序设计(基础篇)原书第10版,梁勇著.pdf