MySQL 5.7.1x 游标嵌套后,内层游标查出的结果不对,急等

MySql 码拜 8年前 (2016-09-19) 1477次浏览
游标定义如下:
curTStruInfo -> DECLARE curTStruInfo CURSOR FOR SELECT A.Stru3Id, B.StruName FROM task_assignment A JOIN structure B ON A.Stru3Id = B.ID WHERE A.TeacherId = userId AND TaskTypeId = taskTypeId;
查出 Stru3Id, StruName 供下面的游标使用,userId 和 taskTypeId 都是预先定义好的变量
curStuInfo -> DECLARE curStuInfo CURSOR FOR SELECT UserID FROM userinfo WHERE StruID = tmpStruID;
该游标依赖 curTStruInfo 查出并fetch的 Stru3Id 来进一步搜寻结果
查询代码如下:

OPEN curTStruInfo;
loop1: WHILE cursorDone = 0 DO
	FETCH curTStruInfo INTO tmpStruID, tmpStruName;
    IF EXISTS(SELECT ClassStruID FROM resultTab WHERE ClassStruID = tmpStruID) THEN
		ITERATE loop1;
	END IF;
	SELECT COUNT(*) INTO classMemberCount FROM userinfo WHERE StruID = tmpStruID;
	SET classFinishedCount = 0;
			    
	SELECT tmpStruID;
	SELECT UserID FROM userinfo WHERE StruID = tmpStruID;
		    
	OPEN curStuInfo;
	WHILE cursorDone = 0 DO
		FETCH curStuInfo INTO tmpStuUID;

		IF EXISTS(SELECT `ID` FROM trainlogs WHERE UserID = tmpStuUID AND trainlogs.`TaskID` = taskId) THEN
			SET classFinishedCount = classFinishedCount + 1;
		END IF;
	END WHILE;
	CLOSE curStuInfo;
	SET cursorDone = FALSE;
			    
	INSERT INTO resultTab(`TaskID`,`ClassStruID`,`ClassName`,`Student_TotalCount`,`Student_FinishedCount`) VALUES(taskId,tmpStruID,tmpStruName,classMemberCount,classFinishedCount);
END WHILE loop1;
CLOSE curTStruInfo;

这是一个双层游标嵌套,放在一个存储过程中,为了方便调试,在第二层游标开始前使用了如下语句打出fetch的值:
SELECT tmpStruID;
SELECT UserID FROM userinfo WHERE StruID = tmpStruID;

上面的第二条语句模拟内层游标 curStuInfo 的查询语句看结果,发现其结果完全不对,查到的UserID全都是同一个值……
但假如本人单独提取出相关 where 变量来单独执行 curStuInfo 的查询语句,结果是对的(UserID集合达到了本人的预期效果)。
使用的MySQL版本为5.7.12,社区免费版。
分不多,只有60分,全给了。
非常郁闷,看起来像是结果被缓存了还是怎么的,本人不确定。
是本人使用游标时漏掉了什么设置项么?请各位 MySQL 高手解答,谢谢啊!

解决方案

60

loop1: WHILE cursorDone = 0 DO ….
只有cursorDone = 0 才会给游标赋值,建议检查二层游标逻辑

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明MySQL 5.7.1x 游标嵌套后,内层游标查出的结果不对,急等
喜欢 (0)
[1034331897@qq.com]
分享 (0)