[ 通常表示 ]  [ 簡易表示 ]  [ シンプル表示 ]

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

カーソル【DB】 (cursor【DB】)

pointこの用語のポイント

pointデータベース関連で出てくるよ

point検索結果からデータを1件ずつ抜き取るための仕組みだよ

point検索結果に対して「今どのデータを処理してまっせ」な位置を示す目印だよ

スポンサーリンク

簡単に書くよ

カーソル【DB】 (cursor【DB】)とは

SQL関連で出てくる仕組みのひとつで、データの「検索条件」と「現在位置」を保持して、複数の検索結果を1件ずつ処理するための仕組み。
概念としては

データベースから取得した検索結果に対する「今どのデータを処理してまっせ」な位置を示す目印のこと
です。
小難しくてよく分からなければ

検索結果からデータを1件ずつ抜き取るための仕組み
と考えても、かまいません。

image piyo

詳しく書くよ

順番に見ていきましょう。
まずは「データベース」と「SQL」について簡単に説明します。
「そんなの説明されなくても知ってるよ!」な人は、適当に読み飛ばしてください。

データベースは「データを入れておく箱」です。
突っ込んで考えると混乱するかもしれません。
何となくのフィーリングで理解してください。

カーソル

SQLは「データベースとやり取りするときに使う言葉」です。

カーソル2

データベースにデータを入れるときは、データベースさんに対して「ちょっと、これを入れておいて」と命令します。
反対にデータベースからデータを取り出すときは、データベースさんに対して「ちょっくら、こんなデータを取り出しておくれ」と命令します。
SQLは、そんな命令をするときに使う言葉です。

以上を踏まえて、SQLにおいて、条件を指定してデータをゴソっと持ってきて~、その中のデータを1行ずつ処理するときに~、今どのデータを処理しようとしてるんじゃろね?を示す位置が「カーソル」です。
あるいは、それらの仕組み全体を指して「カーソル」と言います。

カーソル3

カーソルの使い方ですが、まずはカーソルを定義します。
これは「どんなデータを引っ張ってこいや」な指示です。

次にカーソルを開きます。
このタイミングで実際にデータベースを検索……するかどうかは確認していませんが、多分、検索しているのでしょう。

あとはデータの現在位置を移動しながら1件ずつ取得して、あれやこれやと処理を行います。

あれやこれやの処理が終わったら、カーソルを閉じます。

これが基本的なカーソルの一生です。

ちょいと小難しいかもしれませんが、OracleのPL/SQLを例に、実際のカーソルを見てみますね。
よく分からなければ適当に流し読んでください。

例えば

DECLARE
 CURSOR CUR_HOGE1 IS SELECT column01, column02 FROM tbl_hoge WHERE hoge_flg=1;
 REC_HOGE1 CUR_HOGE1%ROWTYPE;
BEGIN
 OPEN CUR_HOGE1;

 LOOP
  FETCH CUR_HOGE1 INTO REC_HOGE1;
  EXIT WHEN CUR_HOGE1%NOTFOUND;

  (何かの処理)

 END LOOP

 CLOSE CUR_HOGE1;
END;


な、よく分からないコードがあったとしましょう。

CURSOR CUR_HOGE1 IS SELECT column01, column02 FROM tbl_hoge WHERE hoge_flg=1;

の部分がカーソルの宣言です。
ここで「どんなデータを引っ張ってくるよ~!」を定義しています。

次に

OPEN CUR_HOGE1;

の部分がカーソルを開いているところです。
「OPEN」です。
そのまんまですね。

LOOP
 FETCH CUR_HOGE1 INTO REC_HOGE1;
 EXIT WHEN CUR_HOGE1%NOTFOUND;

 (何かの処理)

END LOOP


の部分がメインの処理部分です。

LOOP ~ END LOOP

の部分は「おら~、ぐるぐる回って繰り返せや~」な命令です。
ぐるぐるの中の

FETCH CUR_HOGE1 INTO REC_HOGE1;

のところで、データを1件取得して現在位置を1つ進めています。
この処理を専門用語で「フェッチ(fetch)」と言います。

EXIT WHEN CUR_HOGE1%NOTFOUND;

は条件判定文です。
「もしデータが無かったら(終わりまで行ったら)ぐるぐるを抜けてね」な指示です。

最後に、使い終わったカーソルを閉じます。

CLOSE CUR_HOGE1;

の部分です。
「CLOSE」します。
そのまんまですね。

ここまでの説明をまとめて書くと、以下のようになります。

DECLARE
 CURSOR CUR_HOGE1 IS SELECT column01, column02 FROM tbl_hoge WHERE hoge_flg=1; -- カーソルの宣言
 REC_HOGE1 CUR_HOGE1%ROWTYPE;
BEGIN
 OPEN CUR_HOGE1; -- カーソルを開く

 LOOP -- ぐ~る、ぐ~る
  FETCH CUR_HOGE1 INTO REC_HOGE1; -- フェッチする
  EXIT WHEN CUR_HOGE1%NOTFOUND; -- 終わりだったら、ぐるぐるを抜ける

  (何かの処理)

 END LOOP

 CLOSE CUR_HOGE1; -- カーソルを閉じる
END;


これらの一連の処理における

CUR_HOGE1

が「カーソル」です。

検索結果は1つとは限らないですよね。
いっぱい見つかる可能性もあります。

ですが、いっぱい見つかったとしても、そのいっぱいを同時に処理することができません。
コンピュータさんは、そこまで器用ではないのです。

そこで、いっぱいの中から1つずつ取り出して順番に処理します。

その「1つずつ取り出して順番に処理する」ためにある仕組みがカーソルです。

image piyo2

一言でまとめるよ

まぁ「カーソル」って単語が出てきたら「検索結果に対して1件ずつ処理するための仕組みなんだな~」と、お考えください。

一番上に戻るよ
スポンサーリンク