カーソル【DB】
検索結果からデータを1件ずつ抜き取るための仕組みだよ
検索結果に対して「今どのデータを処理してまっせ」な位置を示す目印だよ
データベース関連で出てくるよ
簡単に書くよ
カーソル【DB】(英:cursor)とは
SQL
(データベースさんと会話するときに使う言葉)関連で出てくる仕組みのひとつ
であり
データの「検索条件」と「現在位置」を保持して、複数の検索結果を1件ずつ処理するための仕組み
です。
概念としては
データベースから取得した検索結果に対する「今どのデータを処理してまっせ」な位置を示す目印のこと
です。
小難しくてよく分からなければ
検索結果からデータを1件ずつ抜き取るための仕組み
と考えても かまいません。
詳しく書くよ
順番に見ていきましょう。
まずは予備知識として「データベース」と「SQL」について簡単に説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。
データベースは「データを入れておく箱」です。
突っ込んで考えると混乱するかもしれません。
何となくのフィーリングで理解してください。
SQLは「データベースと やり取りするときに使う言葉」です。
データベースにデータを入れるときは、データベースさんに「これを入れておいて」と命令します。
データベースからデータを取り出すときは、データベースさんに「こんなデータを取り出しておくれ」と命令します。
SQLは、そんな命令をするときに使う言葉です。
以上を踏まえて
SQLにおいて、条件を指定してデータをゴソっと持ってきて~、その中のデータを1行ずつ処理するときに~、今どのデータを処理しようとしてるんじゃろね?を示す位置
が「カーソル」です。
あるいは、それらの仕組み全体を指して「カーソル」と表現している場合も あります。
カーソルの使い方ですが、まずはカーソルを定義します。
これは「どんなデータを引っ張ってこいや」な指示です。
次にカーソルを開きます。
このタイミングで実際にデータベースを検索……するかどうかは確認していませんが、多分、検索しているのでしょう。
あとはデータの現在位置を移動しながら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つずつ取り出して順番に処理する」ためにある仕組みがカーソルです。
一言でまとめるよ
まぁ「カーソル」って単語が出てきたら「検索結果に対して1件ずつ処理するための仕組みなんだな~」と お考えください。
おまけ
■検索してみる?






