カーソル (データベース エンジン)

リレーショナル データベースで操作を実行する場合、行の完全なセットが操作の対象になります。SELECT ステートメントでは、WHERE 句で指定した条件を満たすすべての行のセットが返されます。このステートメントが返す行の完全なセットを結果セットと呼びます。アプリケーション、特に対話型のオンライン アプリケーションでは、必ずしも、結果セット全体をひとまとめに使用して作業することが効率的であるとは限りません。そのため、このようなアプリケーションでは、一度に 1 行または少数の行のブロックを使用するためのメカニズムが必要になります。カーソルはそのメカニズムを提供する結果セットの拡張機能です。

カーソルでは、次のように結果の処理が拡張されます。

  • 結果セット内の特定の行に位置付けることができます。

  • 結果セット内の現在位置から 1 行または 1 ブロックの行を取得します。

  • 結果セット内の現在位置の行データを修正できます。

  • 結果セット内のデータベース データに対して他のユーザーが行った変更をさまざまなレベルで表示できます。

  • スクリプト、ストアド プロシージャ、およびトリガ内の Transact-SQL ステートメントから、結果セット内のデータにアクセスできます。

カーソルの要求

Microsoft SQL Server では、カーソルの要求方法として、次の 2 つの方法がサポートされます。

  • Transact-SQL

    Transact-SQL 言語では、ISO カーソル構文以降にモデル化されたカーソルを使用するための構文がサポートされます。

  • データベース API (アプリケーション プログラミング インターフェイス) のカーソル機能

    SQL Server では、次のデータベース API のカーソル機能がサポートされます。

    • ADO (Microsoft ActiveX データ オブジェクト)

    • OLE DB

    • ODBC (Open Database Connectivity)

アプリケーションでは、カーソルを要求するこれら 2 つの方法を混在して使用しないでください。また、API を使用してカーソル動作を指定するアプリケーションでは、Transact-SQL の DECLARE CURSOR ステートメントを実行して Transact-SQL カーソルを要求しないでください。アプリケーションで DECLARE CURSOR ステートメントを実行できるのは、API カーソル属性をすべて既定値に戻した場合だけです。

Transact-SQL カーソルも API カーソルも要求されない場合、既定では、SQL Server によって既定の結果セットと呼ばれる完全な結果セットがアプリケーションに返されます。

カーソル処理

Transact-SQL カーソルと API カーソルでは構文が異なりますが、SQL Server のどのカーソルでも、以下の一般的な処理を行います。

  1. カーソルを Transact-SQL ステートメントの結果セットに関連付け、カーソル内の行を更新可能にするかどうかなど、そのカーソルの特性を定義します。

  2. カーソルを設定する Transact-SQL ステートメントを実行します。

  3. 参照するカーソル内の行を取得します。カーソルから 1 行または 1 ブロックの行を取得する操作をフェッチと言います。フェッチを連続して実行し、順方向または逆方向に行を取得することをスクロールと呼びます。

  4. 必要に応じて、カーソル内の現在位置の行に対して、更新または削除の変更操作を行います。

  5. カーソルを閉じます。