・ | Transact-SQL の SELECT ステートメントが返した結果セットを行単位で扱うメカニズム | |
・ | 結果セットを一度に1行または行ブロック単位で処理するための一時的な仮想作業領域 | |
← | 通常リレーショナルデータベースでは条件を満たす完全な行セット(結果セット)が処理の対象 | |
・ | FETCH コマンドを使用して、結果セット内をスクロール可能 |
○ サーバーカーソルとクライアントカーソル
・ | Transact-SQL サーバーカーソル | |
− | Transact-SQL スクリプト、ストアドプロシージャ、トリガで使用 | |
− | サーバー上に実装 | |
− | 一度に1行を処理 | |
・ | API サーバーカーソル | |
−
|
OLE DB、ODBC、DB-Library API 関数を使用、Visual Basic 等の言語で書かれたアプリケーションで使用 | |
− | サーバー上に実装 | |
− | 一度に複数行処理可能 | |
・ | クライアントカーソル | |
− | ODBC ドライバまたは DB-Library DLL によって、また ADO API を実装する DLL によって内部的に実装 | |
− | 結果セットの全行をクライアント上にキャッシュすることで実装 | |
※ | クライアントカーソルよりサーバーカーソルを使用した方がパフォーマンス、操作効率向上 |
○ カーソルの種類
・ | 静的カーソル | |
− | カーソル結果セット全体を tempdb に格納 | |
− | カーソルオープン後に行われた変更は反映されない | |
− | 読み取り専用 | |
・ | 動的カーソル | |
− | カーソルの結果セットのカレントキー値のみを tempdb に格納 | |
− | フェッチ時に他のデータを取得 | |
− | スクロール時に tempdb を更新 | |
− | カーソルオープン後に行われた変更はすべて反映 | |
・ | キーセットドリブンカーソル | |
− | カーソル結果セットのすべてのキーを tempdb に格納 | |
− | フェッチ時に全データを取得 | |
− | カーソルオープン後に行われた変更は反映されるが、他のプロセスから行われた挿入は反映されない | |
− | カーソル内の行の構成要素および順序はカーソルオープン時に固定、値のみ変更を結果セットに反映 | |
・ | 順方向専用カーソル | |
− | カーソル結果セット内の行を順次最初からフェッチ | |
− | 順方向のスクロールのみ可能 | |
− | 他のカーソルのオプションとして設定 |
○ カーソルの扱い方
・ | 操作権限 | |
− | 更新可能 | |
− | 読み取り専用 | |
・ | スクロール順序 | |
− | スクロール可能 | |
− | 高速順方向専用 |
○ 同時実行制御オプション
READ_ONLY | 行にロックをかけない |
OPTIMISTIC | 楽観的同時実行制御を実装 → 更新前にデータ更新状況を timestamp 列で比較 |
SCROLL LOCKS | 悲観的同時実行制御を実装 → データをカーソルの結果セットに読み取る際にロック |
○ Transact-SQL カーソルの使用手順
1. | カーソルを Transact-SQL ステートメントの結果セットに位置づけ、カーソルの特性を定義 | |
⇒ | DECLARE カーソル名 CURSOR [オプション] FOR ステートメント | |
2. | Transact-SQL ステートメントを実行して結果セットを生成、カーソルに読み込み | |
3. | カーソルから1行(行ブロック)で取得(フェッチ)、フェッチを連続実行して行を取得 (スクロール) | |
⇒ | OPEN カーソル名 | |
FETCH NEXT FROM カーソル名 INTO 変数名 | ||
4. | 必要に応じてカーソル内の現在位置の行に対して操作 | |
5. | カーソルを閉じ、割り当てを開放 | |
⇒ | CLOSE カーソル名 | |
DEALLOCATE カーソル名 |