建游标语句:DECLARE MyCursor CURSOR
FOR
这个是SQL语句: Score_UserExam PK_ContestInfoID 这两个表中查找字段。
select PK_UserExamID,FK_UserID,FK_ExamOrContestID from Score_UserExam where IsComplete=0 AND FK_ExamOrContestID in(select PK_ContestInfoID from Contest_Info where FK_ContestGroupID=@GroupID)
这个是游标循环语句
WHILE @@FETCH_STATUS =0
BEGIN
FETCH NEXT FROM MyCursor INTO @UserExamID, @UserID,@ExamManageID
END
1、pl/sql类似于C、 这类语言一次只能处理一条数据库记录,但是如果sql语句返回的结果集是多条的话 就要用到游标。
2、先把多条结果存入到游标中,再循环的一条一条取得(fecth)游标中的记录,取得一条处理一条。
---------------
IF EXISTS(SELECT *FROM sysobjects WHERE name='sp_ContestSubmit')
DROP PROC sp_ContestSubmit
GO
-- =============================================
-- Author: zqt
-- Create date: 2011-11-25
-- Desc: 系统管理员批量给未交卷的考生交卷-
-- =============================================
Create proc sp_ContestSubmit
@GroupID int --考核ID
as
--申明一个游标
DECLARE MyCursor CURSOR
FOR select PK_UserExamID,FK_UserID,FK_ExamOrContestID from Score_UserExam where IsComplete=0 AND FK_ExamOrContestID in(select PK_ContestInfoID from Contest_Info where FK_ContestGroupID=@GroupID)
--打开一个游标
OPEN MyCursor
--循环一个游标
DECLARE @UserExamID int ,@UserID int ,@ExamManageID int
FETCH NEXT FROM MyCursor INTO @UserExamID, @UserID,@ExamManageID
WHILE @@FETCH_STATUS =0
BEGIN
--获取考试考试分数
DECLARE @UserExamScore int
select @UserExamScore=sum(Score) from Score_UserAnswer where FK_UserID=@UserID AND FK_UserExamID=@UserExamID
--修改考生交卷信息
UPDATE [Score_UserExam] SET [Score] =@UserExamScore,[IsComplete] = 1,[EndTime] = getdate(),[DurationSecs] = datediff(ss,BeginTime,getdate()) where PK_UserExamID=@UserExamID
FETCH NEXT FROM MyCursor INTO @UserExamID, @UserID,@ExamManageID
END
--关闭游标
CLOSE MyCursor
--释放资源
DEALLOCATE MyCursor
/* 测试
exec sp_ContestSubmit 1
*/
GO
(责任编辑:admin)
|