C# Programming

カーソル

特に対話型のオンライン アプリケーションは、一度に 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. カーソルのスクロール指定

カーソルは、フェッチオプション により、順方向へスクロールするか、逆方向または相対的なスクロールをするかを指定することができます。

DECLARE cursor_name CURSOR
...
[FORWARD_ONLY | SCROLL]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
...
FOR select_statement
...
 

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

4.カーソルのスクロールタイプ

カーソルのスクロールを指定した場合、さらにスクロールのタイプを指定できます。

DECLARE cursor_name CURSOR
...
[FORWARD_ONLY | SCROLL]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
...
FOR select_statement
...

宣言時のオプション 意味 説明
FAST_FORWARD 高速順方向専用カーソル 最適化された順方向専用、読み取り専用のカーソル。FAST_FORWARDと FORWARD_ONLY のどちらかしか指定できない。
STATIC 静的カーソル
データの一時的コピーがtempdb に作成されます。したがって、ベース テーブルへの修正は、このカーソルで取り出したデータには反映されません。また、このカーソルで修正を行うこともできません。
DYNAMIC 動的カーソル 動的カーソルは、スクロールされるときに、結果セット内の行に対してなされたすべての変更を反映します。結果セット内の行のデータ値、順序、および構成要素は、フェッチを実行するごとに変更 される。
KEYSET キーセット ドリブン カーソル カーソルをオープンした時点で カーソル内の行の構成要素と順序が固定される。行を一意に識別するキーのセットは、tempdb 内の keyset というテーブルに組み込まれる。

5.同時実行性

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

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

6.スクロール ロック

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

スクロール ロック

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