ストアドプロシージャでエラーが発生した場合、そのプロシージャのローカルカーソルはクリーンアップされますか?

TJクラウダー

ストアドプロシージャには、次のカーソルがあります。

DECLARE @cur CURSOR
SET @cur = CURSOR LOCAL FORWARD_ONLY READ_ONLY
FOR     SELECT  -- various columns
        FROM    @localTableVariable

...そして、それを開いて、繰り返して、閉じます。(はい、セット操作を行うのではなく、繰り返す理由があります。)

エラーが発生した場合、そのカーソルは閉じられますか/クリーンアップされますか?たとえば、のMSDNページCLOSEにはそれについて何も表示されませんまたは、TRY/を実装CATCHしてストアドプロシージャコードで閉じる必要がありますか?(そしてRAISEERROR、エラーを許可して、エラーが通常のエラー処理に伝播できるようにします。)

答え「はい、クリーンアップされます」でなければならないと思いますが...

カーソルがテーブル変数ではなく実際のテーブルにある場合、答えは同じでしょうか?

(これは、SET XACT_ABORT ON関連する場合、プロシージャが持つ明示的なトランザクション内にあります。編集:そして、私の特定のユースケースではSET CURSOR_CLOSE_ON_COMMIT ON、トランザクションがコミットまたはロールバックされるため、を使用して閉じることができるようです。ストアドプロシージャの終わりですが、一般的なケースについては興味があります。)

TJクラウダー

SubqueryCrunchからの非常に有用なコメントに基づいて少なくともSQL Server 2012では、使用しているオプションを使用して、カーソルが(すべてのトランザクションを含まずに)クリーンアップされることを経験的に証明しました。

CREATE PROCEDURE tjtemp
AS
BEGIN
        DECLARE @foo TABLE
        (
                id INT
        )
        DECLARE @id INT

        INSERT INTO @foo (id)
        VALUES (1), (2), (3), (4), (5), (6)

        DECLARE cur CURSOR LOCAL FORWARD_ONLY READ_ONLY
        FOR SELECT id FROM @foo
        OPEN cur

        SELECT 'inside' AS Label, * FROM sys.dm_exec_cursors(0) WHERE name = 'cur'

        FETCH NEXT FROM cur INTO @id
        WHILE @@fetch_status = 0
        BEGIN
                PRINT @id
                IF @id = 4
                        RAISERROR(N'ack!', 18, 1);

                FETCH NEXT FROM cur INTO @id
        END
        CLOSE cur
END
GO
SELECT 'before' AS Label, * FROM sys.dm_exec_cursors(0) WHERE name = 'cur'
GO
EXEC tjtemp
GO
SELECT 'after' AS Label, * FROM sys.dm_exec_cursors(0) WHERE name = 'cur'
GO

(これは、カーソル変数ではなく名前付きカーソルを使用しますが、以下を参照してください。)

結果:

ここに画像の説明を入力してください

メッセージ:


(影響を受ける行は0)

(影響を受ける6行)

(影響を受ける1行)
1
2
3
4
メッセージ50000、レベル18、状態1、手順tjtemp、行24
ack!

(影響を受ける行は0)

カーソルは、プロシージャが開始される前には存在せず、プロシージャが開いているときに存在し、プロシージャがエラーで終了した後には存在しないことがわかります。

ドキュメントで何かを見つけたいのですが、これは「確かにそのように機能する必要がある」という直感をサポートします。

カーソル変数を使用すると、のname列にdm_exec_cursors変数の名前が付けられることがわかったので、変数についてもそれを証明できました。

DROP PROCEDURE tjtemp
GO
CREATE PROCEDURE tjtemp
AS
BEGIN
        DECLARE @foo TABLE
        (
                id INT
        )
        DECLARE @id INT
        DECLARE @cur CURSOR

        INSERT INTO @foo (id)
        VALUES (1), (2), (3), (4), (5), (6)

        SET @cur = CURSOR LOCAL FORWARD_ONLY READ_ONLY
        FOR SELECT id FROM @foo
        OPEN @cur

        SELECT 'inside' AS Label, * FROM sys.dm_exec_cursors(0) WHERE name = '@cur'

        FETCH NEXT FROM @cur INTO @id
        WHILE @@fetch_status = 0
        BEGIN
                PRINT @id
                IF @id = 4
                        RAISERROR(N'ack!', 18, 1);

                FETCH NEXT FROM @cur INTO @id
        END
        CLOSE @cur
END
GO
SELECT 'before' AS Label, * FROM sys.dm_exec_cursors(0) WHERE name = '@cur'
GO
EXEC tjtemp
GO
SELECT 'after' AS Label, * FROM sys.dm_exec_cursors(0) WHERE name = '@cur'
GO

(同じ結果です。)

しかし、念のためWHEREに、select from dm_exec_cursors(DBで他の誰も何もしていないとき)に句を付けずに実行しました。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ストアドプロシージャのアーキテクチャ-MVCアプリケーションでストアドプロシージャを処理する必要がありますか、それとも「ワーカーロール」に似たもので処理する必要がありますか?

分類Dev

SQL / PostgreSQL-ストアドプロシージャの「EXCEPTION」ブロックでキャッチされないQUERYでエラーが発生しました

分類Dev

SQL Server20XX-リンクされたサーバークエリを使用してストアドプロシージャをコンパイルする場合の「暗号化はクライアントでサポートされていません」

分類Dev

例外が発生したときに、PL / SQLストアドプロシージャですべての変更をロールバックしますか?

分類Dev

SQLクエリのnvarcharからデータ型intへの変換でストアドプロシージャでエラーが発生しました

分類Dev

ストアード・プロシージャーでローカル一時テーブルを作成し、ストアード・プロシージャーが戻った後もそれを使用し続けることは可能ですか?

分類Dev

Oracleでのストアドプロシージャの実行中にエラーが発生しました

分類Dev

「プロジェクトは、デフォルトのサービス アカウントで完全に初期化されていません。」最初のプロジェクトの新しいアカウントでエラーが発生しましたか?

分類Dev

weblogicのspring / eclipselinkプロジェクトでローカル/グローバルJNDIデータソースルックアップを使用する場合、トランザクションはコミットされません

分類Dev

weblogicのspring / eclipselinkプロジェクトでローカル/グローバルJNDIデータソースルックアップを使用する場合、トランザクションはコミットされません

分類Dev

L1TF(フォアシャドウ)エクスプロイトが修正されたLinuxカーネルバージョンはどれですか?

分類Dev

ストアドプロシージャの実行中にエラーが発生しました:変数が渡されない場合、オブジェクト期間の最大数を超えたようです

分類Dev

クラシックASPでストアドプロシージャを呼び出そうとしたときに3709エラーが発生しました

分類Dev

タスクマネージャーがジョブマネージャーへの接続に失敗する[ループバックまたはリンクローカルではないIPv4アドレスが見つかりませんでした。ローカルホストアドレスを使用します。]

分類Dev

ストアドプロシージャからカーソルで作成された行を返す

分類Dev

このストアドプロシージャのすべてのトランザクションはロールバックされますか

分類Dev

SpringBootアプリケーションでストアドプロシージャを呼び出すときにエラーが発生しました

分類Dev

カーソルを使用したプロシージャのループでエラーが発生しました

分類Dev

シングルステップのsshポート転送は機能しませんが、リモートジャンプサーバーとリモートローカルホストでsshポート転送が別々に実行された場合にのみ機能しますか?

分類Dev

DBMSは、プリペアドステートメントからコンパイルされたクエリをDBMSサーバー上のストアドプロシージャの形式で保存しますか?

分類Dev

カピバラのスクリーンショットをgitlabランナーからデジタルオーシャンキャッシュにアップロードするにはどうすればよいですか?

分類Dev

SQL 2005:カーソルを使用してアップサートのようなストアドプロシージャを最適化できますか?

分類Dev

オブジェクト変数の取得、ブロック変数が設定されていないVBAを使用してSQLServerストアドプロシージャをプルしようとするとエラーが発生します

分類Dev

SQLストアドプロシージャテーブルタイプでエラーが発生する

分類Dev

トランザクションとストアドプロシージャ。この場合、なぜログテーブルが空になるのですか?

分類Dev

ストアドプロシージャの作成中にエラーが発生しました

分類Dev

SQLServerストアドプロシージャの実行時に構文エラーが発生しました

分類Dev

ストアドプロシージャの実行中にエラーが発生しました

分類Dev

ストアドプロシージャの作成中にMysql構文エラーが発生しました

Related 関連記事

  1. 1

    ストアドプロシージャのアーキテクチャ-MVCアプリケーションでストアドプロシージャを処理する必要がありますか、それとも「ワーカーロール」に似たもので処理する必要がありますか?

  2. 2

    SQL / PostgreSQL-ストアドプロシージャの「EXCEPTION」ブロックでキャッチされないQUERYでエラーが発生しました

  3. 3

    SQL Server20XX-リンクされたサーバークエリを使用してストアドプロシージャをコンパイルする場合の「暗号化はクライアントでサポートされていません」

  4. 4

    例外が発生したときに、PL / SQLストアドプロシージャですべての変更をロールバックしますか?

  5. 5

    SQLクエリのnvarcharからデータ型intへの変換でストアドプロシージャでエラーが発生しました

  6. 6

    ストアード・プロシージャーでローカル一時テーブルを作成し、ストアード・プロシージャーが戻った後もそれを使用し続けることは可能ですか?

  7. 7

    Oracleでのストアドプロシージャの実行中にエラーが発生しました

  8. 8

    「プロジェクトは、デフォルトのサービス アカウントで完全に初期化されていません。」最初のプロジェクトの新しいアカウントでエラーが発生しましたか?

  9. 9

    weblogicのspring / eclipselinkプロジェクトでローカル/グローバルJNDIデータソースルックアップを使用する場合、トランザクションはコミットされません

  10. 10

    weblogicのspring / eclipselinkプロジェクトでローカル/グローバルJNDIデータソースルックアップを使用する場合、トランザクションはコミットされません

  11. 11

    L1TF(フォアシャドウ)エクスプロイトが修正されたLinuxカーネルバージョンはどれですか?

  12. 12

    ストアドプロシージャの実行中にエラーが発生しました:変数が渡されない場合、オブジェクト期間の最大数を超えたようです

  13. 13

    クラシックASPでストアドプロシージャを呼び出そうとしたときに3709エラーが発生しました

  14. 14

    タスクマネージャーがジョブマネージャーへの接続に失敗する[ループバックまたはリンクローカルではないIPv4アドレスが見つかりませんでした。ローカルホストアドレスを使用します。]

  15. 15

    ストアドプロシージャからカーソルで作成された行を返す

  16. 16

    このストアドプロシージャのすべてのトランザクションはロールバックされますか

  17. 17

    SpringBootアプリケーションでストアドプロシージャを呼び出すときにエラーが発生しました

  18. 18

    カーソルを使用したプロシージャのループでエラーが発生しました

  19. 19

    シングルステップのsshポート転送は機能しませんが、リモートジャンプサーバーとリモートローカルホストでsshポート転送が別々に実行された場合にのみ機能しますか?

  20. 20

    DBMSは、プリペアドステートメントからコンパイルされたクエリをDBMSサーバー上のストアドプロシージャの形式で保存しますか?

  21. 21

    カピバラのスクリーンショットをgitlabランナーからデジタルオーシャンキャッシュにアップロードするにはどうすればよいですか?

  22. 22

    SQL 2005:カーソルを使用してアップサートのようなストアドプロシージャを最適化できますか?

  23. 23

    オブジェクト変数の取得、ブロック変数が設定されていないVBAを使用してSQLServerストアドプロシージャをプルしようとするとエラーが発生します

  24. 24

    SQLストアドプロシージャテーブルタイプでエラーが発生する

  25. 25

    トランザクションとストアドプロシージャ。この場合、なぜログテーブルが空になるのですか?

  26. 26

    ストアドプロシージャの作成中にエラーが発生しました

  27. 27

    SQLServerストアドプロシージャの実行時に構文エラーが発生しました

  28. 28

    ストアドプロシージャの実行中にエラーが発生しました

  29. 29

    ストアドプロシージャの作成中にMysql構文エラーが発生しました

ホットタグ

アーカイブ