12

テーブルに変更が加えられたときに、いくつかの監査タスクを実行するために使用されるトリガーがあります。このトリガー内にはWHILEループがあり、ループ内には、ループの次の反復の前に宣言され、使用され、閉じられ、割り当てが解除されるカーソルがあります。

テーブルを変更してトリガーを実行するストアドプロシージャを呼び出すと、Management Studio内からこれを実行すると、すべてが期待どおりに機能します。

ただし、このストアドプロシージャをJava Webアプリケーション内から呼び出すと、「...という名前のカーソルが既に存在します」というエラーが発生します。

このストアドプロシージャを手動で実行すると機能し、Webアプリケーションから実行すると機能しない理由はありますか?

4

3 に答える 3

31

GLOBALカーソルを使用しているようですが、このような問題が発生する可能性があります。

カーソルを使用する必要がある場合:

可能であれば、すべてのコードでローカルカーソルを使用してください。たとえば、次のように「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

複数のスレッドによって呼び出されているように聞こえるので、2番目のスレッドが名前を使用しようとしたときにすでに存在しています。名前などにGUIDを使用して、カーソルに動的に名前を付けてみてください。このアプローチはお勧めしません。

可能であれば、セットベースのアプローチを優先して、トリガーコードからカーソルを削除することをお勧めします。トリガー内でカーソルを使用するオーバーヘッドはかなり高くなければなりません。

于 2011-07-18T16:20:28.767 に答える