Infinity loop in cursor iteration
原始代码如下:
begin
DECLARE
@SQL_STMT NVARCHAR(300),
@V_CLIENT_ID INT,
@V_PGNAME VARCHAR(1000),
@V_LOGID INT;
DECLARE C2 CURSOR FOR SELECT PGNAME,CLIENT_ID FROM GPGLOBAL.GPLOG;
OPEN C2
FETCH NEXT FROM C2 into @V_PGNAME , @V_CLIENT_ID
WHILE(@@FETCH_STATUS=0)
BEGIN
EXEC GETNEXTSEQUENCENUMBER @V_LOGID OUT,'GPLOG_SEQ';
SET @SQL_STMT='UPDATE GPGLOBAL.GPLOG SET LOG_ID='+CAST(@V_LOGID AS VARCHAR)+' WHERE PGNAME='''+@V_PGNAME+''' AND
CLIENT_ID='+CAST(@V_CLIENT_ID AS VARCHAR);
EXEC SP_EXEC_WITH_LOG 'DB-1216',@SQL_STMT;
FETCH NEXT FROM C2 INTO @V_PGNAME , @V_CLIENT_ID
END
CLOSE C2
DEALLOCATE C2
END
上面的这个存储过程会无限执行,主要原因是游标C2是基于表 GPGLOBAL.GPLOG,在游标C2进行循环的时候,循环里的代码改变了GPGLOBAL.GPLOG的数据,
这会导致,C2看到新的改变过的记录,一次循环下去,一直在执行,无法停下来。只要给C2 定义成 static 就可以了。它只会看到游标打开时候的记录,相当于是那个时候的一个snapshot。
DECLARE C2 CURSOR STATIC FOR SELECT PGNAME,CLIENT_ID FROM GPGLOBAL.GPLOG;
最新文章
- Linux上如何查看物理CPU个数,核数,线程数
- NXP NFC移植及学习笔记(原创)
- 10天学会phpWeChat——第六天:实现新闻的后台管理
- Google V8编程详解(二)HelloWorld
- PMP和PRINCE2
- fir.im Weekly - 一切从知识重构开始
- Javaweb -- ServletContextListener
- 判断Set里的元素是否重复、==、equals、hashCode方法研究-代码演示
- 简单版问卷调查系统(Asp.Net+SqlServer2008)
- (转)分布式缓存GemFire架构介绍
- windows进程的创建方法
- 记一次 Google 面试经历
- 写下你的第一个Django应用,第三部分
- Entity Framework 学习初级篇7--基本操作:增加、更新、删除、事务
- Java源码分析系列之HttpServletRequest源码分析
- C/C++语言简介之编程开发
- [HEOI2016]排序
- (转)JMeter学习逻辑控制器
- 2018-08-27 使用JDT核心库解析JDK源码后初步分析API命名
- Mastering Creativity:A brief guide on how to overcome creative blocks