2005年10月27日

カーソル

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 カーソル名
posted by w@ko at 19:23|  ・SQL Server ノート | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。