データベースにおけるカーソル(英: cursor)は、一連のデータに順にアクセスする際の検索条件および「現在位置」を保持するデータ要素である。 一般にデータベースは、同じ種類のデータを数多く蓄積しており、利用者が求めるデータも1件だけではなく複数件になる可能性がある。このようなケースは、カーソルを使って以下のようにイテレータの要領で実現できる。 システムによっては5において、次のデータに進む以外に、ひとつ前のデータに戻ることも許している。 カーソルを使う理由の一つとして、クエリの結果が多数の行を持つことによるメモリのオーバーランを防ぐことが挙げられる。PL/pgSQLではメモリ問題を引き起こさないようにforループが内部で自動的にカーソルを用いるため、この心配がない。 関係データベース用の問い合わせ言語として広く使われているSQLでは、カーソルを用いたアクセスのために一連のステートメントを提供している。「DECLARE CURSOR」でカーソルを宣言し、「FETCH」でカーソル位置のデータを取得するとともに次のデータに進む。データを変更する「UPDATE」や削除する「DELETE」は、「WHERE CURRENT OF カーソル名」を指定することで、カーソル位置のデータを操作できる。使用後は「CLOSE」で解放する。具体的な文法はSQL#カーソル定義・操作を参照。 C言語プログラムからSQLを使ってデータベースにアクセスするためのライブラリのひとつとしてODBCがある。ODBCはMicrosoft Windowsで広まった後、業界標準のSQL/CLIやJDBCのベースとなった。 カーソル操作に係るSQLステートメントには、以下のように個別のODBC関数が対応している。 ODBCにおけるカーソル操作ODBC関数対応するSQLステートメント ODBCでは、アプリケーションプログラムがカーソルを直接指定することは、ほとんどない。上記の関数はいずれも「ステートメントハンドル」(Statement Handle)を引数としており[1]、このハンドルが指し示すデータ構造の中にカーソルも含まれているという扱いになる。すなわち、ステートメントハンドルがイテレータの役割を果たしている。 dbmは関係データベースより単純な、キーと値の対応だけからなるデータベース機能を提供する。ここでもデータベース上の「現在位置」を指し示すために「カーソル」の語が使われている[2]。
概要
利用者は検索条件やソート順序を指定してカーソルを定義する。
パラメータを利用している場合は値を決定し、データへのアクセスを開始する。
カーソル位置のデータを取得する。検索結果の終端なら7へ。
必要に応じてカーソル位置のデータを変更・削除する。
カーソルを「次のデータ」へと進める。
3から繰り返し。
繰り返しの終了後、カーソルを解放する。
具体例
SQL
ODBC
SQLPrepareDECLARE CURSOR
SQLExecuteOPEN
SQLFetchFETCH
SQLFreeStmtCLOSE
dbm
注意点
カーソルは実行中の検索条件や現在位置を保持するために、メモリ容量などの資源を必要とする。カーソルの解放漏れはメモリリークにつながる可能性がある。
標準SQL規格では、トランザクションを終了するとカーソルは破棄される仕様である。しかし、DBMSによっては破棄されずそのままデータにアクセスすることができる。標準SQL規格に準拠した使い方をするのであれば、トランザクション終了後はカーソルを破棄するべきである。
脚注^ Microsoft. “ ⇒ODBC Function Summary” (英語). 2008年6月7日閲覧。
^ JMプロジェクト. “ ⇒dbopen”. 2008年6月7日閲覧。
表
話
編
歴
データベース管理システム
データモデル
関係モデル
データベース設計
正規化
参照整合性
関係代数
関係論理
データベース管理システム
関係データベース管理システム
オブジェクト関係データベース
分散データベース
トランザクション処理
概念
データベース
ACID
CRUD
3値論理(NULL)
候補キー
外部キー
主キー
スーパーキー
代理キー
オブジェクト
関係 (表)
ビュー
トランザクション
ログ
トリガ
索引
ストアドプロシージャ
カーソル
分割
SQL
SELECT
INSERT
UPDATE
MERGE
DELETE
JOIN
CREATE
DROP
COMMIT
ROLLBACK
TRUNCATE
ALTER
WHERE
SAVEPOINT
構成要素
並行性制御
データ辞書
JDBC
ODBC
データベース言語
問い合わせ言語
クエリ最適化
クエリ実行計画
データベース製品
関係データベース管理システムの比較データベース接続クライアント カテゴリ