志在指尖
用双手敲打未来

sql 游标(使用实例详解)

sql游标

1.1游标的概念
游标(Cursor)它运用户可逐行拜访由SQLServer回来的成果集。运用游标(cursor)的一个首要的原因就是把调集操作转换成单个记载处理方式。用SQL言语从数据库中检索数据后,成果放在内存的一块区域中,且成果往往是一个含有多个记载的调集。游标机制答应用户在SQLserver内逐行地拜访这些记载,按照用户自己的意愿来显示和处理这些记载。
1.2游标的长处
从游标界说能够得到游标的如下长处,这些长处使游标在实际应用中发挥了重要作用:
1)答应程序对由查询句子select回来的行调会集的每一行履行相同或不同的操作,而不是对整个行调集履行同一个操作。
2)提供对基于游标位置的表中的行进行删去和更新的能力。
3)游标实际上作为面向调集的数据库办理系统(RDBMS)和面向行的程序设计之间的桥梁,使这两种处理方式经过游标沟通起来。
1.3游标的运用
讲了这个多游标的长处,现在咱们就亲自来揭开游标的神秘的面纱。
运用游标的顺序:声名游标、翻开游标、读取数据、封闭游标、删去游标。
1.3.1声明游标
最简略游标声明:DECLARE<游标名>CURSORFOR;
其中select句子可所以简略查询,也可所以杂乱的接连查询和嵌套查询
比如:[已表2AddSalary为比如]
Declaremycursorcursorforselect*fromAddSalary这样我就对表AddSalary申明了一个游标mycursor
【高档备注】
DECLARE<游标名>[INSENSITIVE][SCROLL]CURSORFOR这里我说一下游标中级应用中的[INSENSITIVE]和[SCROLL]
INSENSITIVE
标明MSSQLSERVER会将游标界说所选取出来的数据记载存放在一暂时表内(建立在tempdb数据库下)。对该游标的读取操作皆由暂时表来应对。因此,对根本表的修正并不影响游标提取的数据,即游标不会随着根本表内容的改变而改变,同时也无法经过游标来更新根本表。假如不运用该保留字,那么对根本表的更新、删去都会反映到游标中。
另外应该指出,当遇到以下状况产生时,游标将主动设定INSENSITIVE选项。
a.在SELECT句子中运用DISTINCT、GROUPBY、HAVINGUNION句子;
b.运用OUTERJOIN;
c.所选取的任意表没有索引;
d.将实数值当作选取的列。
SCROLL
标明一切的提取操作(如FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)都可用。假如不运用该保留字,那么只能进行NEXT提取操作。由此可见,SCROLL极大地增加了提取数据的灵活性,能够随意读取成果会集的任一行数据记载,而不用封闭再
重开游标。
1.3.2翻开游标
十分简略,咱们就翻开刚才咱们声明的游标mycursor
OPENmycursor
1.3.3读取数据
FETCH[NEXT|PRIOR|FIRST|LAST]FROM{游标名|@游标变量名}[INTO@变量名[,…]]
参数说明:
NEXT取下一行的数据,并把下一行作为当前行(递加)。由于翻开游标后,行指针是指向该游标第1行之前,所以第一次履行FETCHNEXT操作将取得游标会集的第1行数据。NEXT为默认的游标提取选项。
INTO@变量名[,…]把提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标成果会集的相应列相关联。各变量的数据类型有必要与相应的成果列的数据类型匹配或是成果列数据类型所支撑的隐性转换。变量的数目有必要与游标挑选列表中的列的数目一致。
现在咱们就取出mycursor游标的数据吧!
当游标被翻开时,行指针将指向该游标集第1行之前,假如要读取游标会集的第1行数据,有必要移动行指针使其指向第1行。就本例而言,能够运用下列操作读取第1行数据:
Eg:Fetchnextfrommycursor或则Fetchfirstfrommycursor
这样我就取出了游标里的数据,但是光光这样可不行,咱们还需要将取出的数据赋给变量
//声明2个变量declare@O_IDNVARCHAR(20)declare@A_Salaryfloat//将取出的值传入刚才声明的2个变量Fetchnextfrommycursorinto@O_ID,@A_Salary1.3.4封闭游标
CLOSEmycursor
1.3.5删去游标
DEALLOCATEmycursor

sql游标使用实例详解

IFEXISTS(SELECT*FROMsysobjectsWHEREname=’sp_ContestSubmit’)
DROPPROCsp_ContestSubmit
GO
–=============================================
–Author:zqt
–Createdate:2011-11-25
–Desc:系统管理员批量给未交卷的考生交卷-竞赛
–=============================================
Createprocsp_ContestSubmit
@GroupIDint–考核ID
as
–申明一个游标
DECLAREMyCursorCURSOR
FORselectPK_UserExamID,FK_UserID,FK_ExamOrContestIDfromScore_UserExamwhereIsComplete=0ANDFK_ExamOrContestIDin(selectPK_ContestInfoIDfromContest_InfowhereFK_ContestGroupID=@GroupID)
–打开一个游标
OPENMyCursor
–循环一个游标
DECLARE@UserExamIDint,@UserIDint,@ExamManageIDint
FETCHNEXTFROMMyCursorINTO@UserExamID,@UserID,@ExamManageID
WHILE@@FETCH_STATUS=0
BEGIN
–获取考试考试分数
DECLARE@UserExamScoreint
select@UserExamScore=sum(Score)fromScore_UserAnswerwhereFK_UserID=@UserIDANDFK_UserExamID=@UserExamID
–修改考生交卷信息
UPDATE[Score_UserExam]SET[Score]=@UserExamScore,[IsComplete]=1,[EndTime]=getdate(),[DurationSecs]=datediff(ss,BeginTime,getdate())wherePK_UserExamID=@UserExamID
FETCHNEXTFROMMyCursorINTO@UserExamID,@UserID,@ExamManageID
END
–关闭游标
CLOSEMyCursor
–释放资源
DEALLOCATEMyCursor
/*测试
execsp_ContestSubmit1
*/
GO

未经允许不得转载:IT技术网站 » sql 游标(使用实例详解)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载