宇宙仮面の
C# Programming

 
SQL 2008

カーソル

特に対話型のオンライン アプリケーションは、一度に 1 行だけ、または少数の行を処理するためのメカニズムが必要になります。カーソルはそのメカニズムを提供します。

1.目次

1.目次
2.カーソルの種類
3.カーソルの分類
4.カーソルタイプ
5.同時実行性
6.スクロール_ロック

2.カーソルの種類

 
カーソルの種類 説明
T-SQL カーソル サーバー カーソル。
主にT-SQL スクリプト、ストアド プロシージャ、およびトリガの中で使用されます。
API サーバー カーソル サーバー カーソル。
OLE DB、ODBC、および DB-Library がサポートするAPI サーバー カーソル。サーバー上で実行されます。
API サーバー カーソルは、次の4つをサポートしています。
  • 静的カーソル
  • 動的カーソル
  • 順方向専用カーソル
  • キーセット ドリブン カーソル

ただし、複数の結果セットを返すバッチまたはストアド プロシージャをサポートしていないなどの制限事項があります。

クライアント カーソル クライアント アプリケーションが API カーソル関数を呼び出すことにより実行する。クライアント上に結果セットがキャッシュされる。

クライアントカーソルは、同時実行性、位置指定更新精度、クライアント側メモリ、トラフィックなどにデメリットがあり、サーバーカーソルのほうが望ましい。

注意:これらの各種カーソルを混合して使用しない。

次は、T-SQLカーソルの実行例。

Image

3. カーソルの分類

カーソルは、サポートするフェッチ オプションによって次のように分類できます。

分類 説明
順方向専用 最初の行から最後の行へと順次に行をフェッチする必要があります。FETCH NEXT だけ実行できます。
スクローラブル カーソル内の任意の位置からランダムに行をフェッチできます。すべてのフェッチ操作が許容されます。ただし例外として、動的カーソルは FETCH ABSOLUTE をサポートしていません。
  • FETCH FIRST
  • FETCH NEXT
  • FETCH PRIOR
  • FETCH LAST
  • FETCH ABSOLUTE n
  • FETCH RELATIVE n
 

4.カーソルタイプ

 

分類 説明
順方向専用カーソル スクロールをサポートしていません。カーソル内の最初から最後まで順次に行をフェッチする機能だけをサポートしています。
高速順方向専用カーソル 静的カーソルの1つとして、高速順方向専用カーソルがあります。T-SQLの場合、DECLARE CURSOR で FAST_FORWARD 句を指定できます。これにより、最適化された順方向専用、読み取り専用のカーソルを使用できます。
静的カーソル
静的カーソルをオープンすると、そのカーソルの完全な結果セットが tempdb に作成されます。静的カーソルは常に、カーソルをオープンした時点の結果セットの状態を表示します。
動的カーソル 動的カーソルは、スクロールされるときに、結果セット内の行に対してなされたすべての変更を反映します。結果セット内の行のデータ値、順序、および構成要素は、フェッチを実行するごとに変更できます。
キーセット ドリブン カーソル カーソルをオープンした時点で SELECT ステートメントで限定されたすべての行から取り出したキー値のセット。キーセットは、カーソルをオープンするときに tempdb に作成されます。

.同時実行性

SQL Server 2005 では、以下の 4 つの同時実行オプションがサポートされています。

同時実行性 説明
READ_ONLY カーソルによって位置指定更新することはできません。また、結果セットを構成する行にはロックがかかりません。
OPTIMISTIC WITH VALUES オプティミスティック同時実行制御。
ユーザーがカーソルをオープンしてから行を更新するまでの間に、ほかのユーザーが行を更新する可能性がほとんどない場合に使用する。この場合、ロックがかからないので、スループットが高い。
OPTIMISTIC WITH ROW VERSIONING オプティミスティック同時実行制御。
元になるテーブルが、バージョン識別子を持っている必要がある。その識別子により、カーソルに行を読み込んだ後にその行が変更されたかどうかを判断できる。
SCROLL LOCKS ペシミスティック同時実行制御。
行をフェッチするとき各行に対してロックを取得する。ロックは、次にその行をフェッチするか、カーソルをクローズするまで保持される。

.スクロール ロック

スクロール ロックの種類は、カーソル同時実行オプションおよびカーソルの SELECT ステートメントに指定されたロック ヒントによって次のように決まります。

スクロール ロック

ロック ヒント
読み取り専用 値に基づくオプティミスティック 行バージョンに基づくオプティミスティック
ロック
ヒントなし ロックなし ロックなし ロックなし 更新
NOLOCK ロックなし ロックなし ロックなし ロックなし
HOLDLOCK 共有 共有 共有 更新
UPDLOCK エラー 更新 更新 更新
TABLOCKX エラー ロックなし ロックなし 更新
ほかのすべて ロックなし ロックなし ロックなし 更新