12

我有一个触发器,用于在对表进行更改时执行一些审计任务。在这个触发器中有一个 WHILE 循环,并且在循环中有一个游标,它在循环的下一次迭代之前被声明、使用、关闭然后释放。

当我调用一个更改表并反过来导致触发器运行的存储过程时,我从 Management Studio 中执行此操作,一切都按预期工作。

但是,当从我的 Java Web 应用程序中调用此存储过程时,我收到一个错误:“名称为 ... 的游标已经存在”。

这个存储过程在我手动执行时会起作用,而在从 Web 应用程序运行时不起作用,是否有原因?

4

3 回答 3

31

听起来您可能正在使用 GLOBAL 游标,这可能会导致这样的问题。

如果必须使用游标:

如果可以,请在所有代码中使用 LOCAL 游标。例如,使用“LOCAL”关键字声明游标,如下所示:

DECLARE yourcursor CURSOR LOCAL ...
于 2011-07-19T00:13:30.157 回答
7

你也可以试试这个

IF CURSOR_STATUS('global', 'Cursorname') >= -1
BEGIN
    CLOSE Cursorname
    DEALLOCATE Cursorname
END
于 2014-04-14T13:07:10.753 回答
4

听起来有点像它被多个线程调用,因此在第二个线程尝试使用该名称时已经存在。您可以尝试使用名称中的 GUID 等动态命名光标。我不推荐这种方法。

如果可能的话,我建议您从触发代码中删除光标,以支持基于集合的方法。在触发器中使用光标的开销必须相当高。

于 2011-07-18T16:20:28.767 回答