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