Sybase - 关闭和解除分配游标有什么用?
Sybase - What is the use of close & deallocate cursor?
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 次连续调用来检查任何游标阈值。
首先,必须理解一些重要的概念。
CLOSE 命令很有用,因为您可能希望以后再使用此游标,直到您再次将其设置为 OPEN,但是,此命令不会删除对象引用,这意味着内存仍然会受到影响.因此,您不能创建另一个与另一个已关闭游标同名的游标。
另一方面,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)。
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 次连续调用来检查任何游标阈值。
首先,必须理解一些重要的概念。
CLOSE 命令很有用,因为您可能希望以后再使用此游标,直到您再次将其设置为 OPEN,但是,此命令不会删除对象引用,这意味着内存仍然会受到影响.因此,您不能创建另一个与另一个已关闭游标同名的游标。
另一方面,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)。