我有一个触发器,用于在对表进行更改时执行一些审计任务。在这个触发器中有一个WHILE循环,并且在循环中有一个游标被声明,使用,关闭,然后在循环的下一次迭代之前被释放。
当我调用更改表的存储过程然后导致触发器运行时,我在Management Studio中执行此操作,所有操作都按预期工作。
但是,当从我的Java Web应用程序中调用此存储过程时,出现错误:“名称为...的游标已存在”。
这种存储过程在我手动执行时是否有效,而在从Web应用程序运行时无效?
答案 0 :(得分:30)
听起来你可能正在使用GLOBAL游标,这可能会导致这样的问题。
如果必须使用游标:
如果可以,请在所有代码中使用LOCAL游标。 例如使用“LOCAL”关键字声明游标,如下所示:
DECLARE yourcursor CURSOR LOCAL ...
答案 1 :(得分:6)
你也可以尝试这个
IF CURSOR_STATUS('global', 'Cursorname') >= -1
BEGIN
CLOSE Cursorname
DEALLOCATE Cursorname
END
答案 2 :(得分:4)
听起来有点像被多个线程调用,因此当第二个线程尝试使用该名称时已经存在。您可以尝试使用名称中的GUID动态命名游标。我不建议使用此方法。
我建议您从触发器代码中删除光标,如果可能的话,支持基于集合的方法。在触发器中使用光标的开销必须非常高。