EXEC SQL PREPARE MyStmt FROM :hStmt;
EXEC SQL DECLARE MyCursor CURSOR FOR MyStmt;
EXEC SQL SET CURSOR ROWS :hCursorRows FOR MyCursor;
--------------------------------------
--------------------------------------
--------------------------------------
EXEC SQL CLOSE MyCursor;
EXEC SQL DEALLOCATE CURSOR MyCursor;
在此处关闭和取消分配光标有什么用?即使我们删除最后两行并再次调用此函数它也能正常工作。尝试使用30000次连续调用来检查任何游标阈值。
答案 0 :(得分:0)
首先,必须理解一些重要的概念。
CLOSE命令很有用,因为您可能希望阻止此光标在以后再次使用,直到再次将其设置为OPEN,但是,此命令不会删除对象引用,这意味着内存仍然受其影响。因此,您无法创建另一个与另一个关闭光标名称相同的游标。
另一方面,DEALLOCATE确实删除了对象引用。这意味着操作系统可能会覆盖以前与该对象关联的内存,执行此命令后,您将能够声明另一个具有相同名称的游标。
也就是说,如果您计划再次使用该对象,则应该只关闭CLOSE。现在......如果您不打算再次使用该对象,为什么不只是DEALLOCATE?我的意思是,CLOSE命令听起来多余,对吗?
嗯......这取决于。
默认的系统行为是将游标声明为GLOBAL。这意味着,除非您将游标显式设置为LOCAL(似乎不是您的情况),在声明了游标的主过程内调用的过程也将访问此游标。这就是CLOSE命令存在的原因,而不仅仅是DEALLOCATE命令:通过内部调用提供GLOBAL游标(默认)的方法。
如果仅存在DEALLOCATE,则在主过程中使用时,内部过程将无法访问游标。通过这种方式,即使存在GLOBAL行为,也不例外。
正确的做法是使用LOCAL游标进行本地游戏。
所以,答案是:如果你确定你的光标是LOCAL,那么只使用DEALLOCATE或两者(CLOSE和DEALLOCATE)没有实际差异,因为DEALLOCATE也会执行CLOSE。
但是如果您的光标是GLOBAL,则意味着您打算再次使用它(否则,设置显式LOCAL)并且您可能需要处理关闭和开口,在所有调用结束时只有一个DEALLOCATE,或者甚至不是,因为游标变量不必显式释放。当变量超出范围时,隐式释放变量(引用:http://msdn.microsoft.com/en-us/library/ms188782.aspx)。