カーソル
特に対話型のオンライン アプリケーションは、一度に 1 行だけ、または少数の行を処理するためのメカニズムが必要になります。カーソルはそのメカニズムを提供します。
1.目次
2.カーソルの種類
3.カーソルのスクロール指定
4.カーソルのスクロールタイプ
5.同時実行性
6.スクロール_ロック
カーソルの種類 |
説明 |
T-SQL カーソル |
サーバー カーソル。
主にT-SQL スクリプト、ストアド プロシージャ、およびトリガの中で使用されます。 |
API サーバー カーソル |
サーバー カーソル。
OLE DB、ODBC、および DB-Library がサポートするAPI サーバー カーソル。サーバー上で実行されます。
API サーバー カーソルは、次の4つをサポートしています。
- 静的カーソル
- 動的カーソル
- 順方向専用カーソル
- キーセット ドリブン カーソル
ただし、複数の結果セットを返すバッチまたはストアド
プロシージャをサポートしていないなどの制限事項があります。
|
クライアント カーソル |
クライアント アプリケーションが API
カーソル関数を呼び出すことにより実行する。クライアント上に結果セットがキャッシュされる。クラ
クライアントカーソルは、同時実行性、位置指定更新精度、クライアント側メモリ、トラフィックなどにデメリットがあり、サーバーカーソルのほうが望ましい。 |
注意:これらの各種カーソルを混合して使用しない。
次は、T-SQLカーソルの実行例。
カーソルは、フェッチオプション
により、順方向へスクロールするか、逆方向または相対的なスクロールをするかを指定することができます。
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
|
カーソルのスクロールを指定した場合、さらにスクロールのタイプを指定できます。
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
というテーブルに組み込まれる。 |
SQL Server 2000 では、以下の 4 つの同時実行オプションがサポートされています。
同時実行性 |
説明 |
READ_ONLY |
カーソルによって位置指定更新することはできません。また、結果セットを構成する行にはロックがかかりません。 |
OPTIMISTIC WITH VALUES |
オプティミスティック同時実行制御。 ユーザーがカーソルをオープンしてから行を更新するまでの間に、ほかのユーザーが行を更新する可能性がほとんどない場合に使用する。この場合、ロックがかからないので、スループットが高い。 |
OPTIMISTIC WITH ROW VERSIONING |
オプティミスティック同時実行制御。 元になるテーブルが、バージョン識別子を持っている必要がある。その識別子により、カーソルに行を読み込んだ後にその行が変更されたかどうかを判断できる。 |
SCROLL LOCKS |
ペシミスティック同時実行制御。 行をフェッチするとき各行に対してロックを取得する。ロックは、次にその行をフェッチするか、カーソルをクローズするまで保持される。 |
スクロール ロックの種類は、カーソル同時実行オプションおよびカーソルの SELECT ステートメントに指定されたロック
ヒントによって次のように決まります。
スクロール ロック |
ロック ヒント |
読み取り専用 |
値に基づくオプティミスティック |
行バージョンに基づくオプティミスティック |
ロック |
ヒントなし |
ロックなし |
ロックなし |
ロックなし |
更新 |
NOLOCK |
ロックなし |
ロックなし |
ロックなし |
ロックなし |
HOLDLOCK |
共有 |
共有 |
共有 |
更新 |
UPDLOCK |
エラー |
更新 |
更新 |
更新 |
TABLOCKX |
エラー |
ロックなし |
ロックなし |
更新 |
ほかのすべて |
ロックなし |
ロックなし |
ロックなし |
更新 |