Sybase - 关闭和释放游标有什么用?


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个顺序呼叫尝试了它,以检查任何光标阈值。

首先,必须理解一些重要的概念。

关闭命令很有用,因为您可能需要防止此光标以后使用,直到您再次将其设置为打开,但是,此命令不会删除对象引用,这意味着存储器仍然与之妥协。因此,您无法使用另一个关闭光标的同名创建另一个光标。

另一方面,DealLocate确实删除了对象引用。这意味着操作系统可以覆盖以前与对象关联的内存,并且在执行此命令后,您将能够声明具有相同名称的另一个光标。

也就是说,如果您打算再次使用该对象,则需要关闭。现在...如果您不打算再次使用该对象,为什么不只是Deacklocation?我的意思是,关闭命令听起来多余,对

好吧...这取决于。

默认系统行为是将光标声明为全局。这意味着,除非您明确将光标设置为本地(似乎不是您的案例(,否则在一个主过程中调用的过程中,该过程已将光标宣布为光标,也将访问该光标。这就是为什么关闭命令存在的原因,不仅是DeackLocate命令:提供通往全局光标的方法(默认值(可以通过此内部呼叫可用。

如果仅存在DealLocation,则在主过程中使用时,内部过程将无法访问光标。这样,甚至没有存在全球行为的理由。

正确的做法是将本地光标用于本地倾盆。

因此,答案是:如果您确定您的光标是本地的,则仅使用DealLocate或同时使用(关闭和DealLocate(就不会有差异,因为DealLocation也可以执行关闭。

但是如果您的光标是全局甚至不是那样,因为光标变量不必明确处理。当变量超出范围时,该变量被隐式交易(参考:http://msdn.microsoft.com/en-us/library/ms188782.aspx(。

相关内容

  • 没有找到相关文章

最新更新