cursor: 検索結果をとあるところに溜めておいて、そこから1件ずつ抜き出す仕組み

fetch: データベースの検索結果から1件抜き取ることなんだな~

 

えっとですね。
フェッチを理解しようと思ったら「カーソル」から理解した方が分かりやすいと思います。
もし余裕がある方は「カーソル」の説明から、ご覧ください。

あっ、面倒くさい方は、そのまま読み進めていただいても結構ですよ。
簡単にですが、カーソルの説明も併せて書いておきます。

それでは本題のフェッチのお話です。

例えば、そうですね。
ピヨ太君がピヨピヨ検索エンジンで美味しい肉まんの作り方を検索しました。



そうしたら条件に一致する情報が10件見つかりました。



ピヨ太くんは、見つかった検索結果の中から1つ選んで中を見ます。



このときの「見つかった検索結果から1つ選んで中を見る行為」が「フェッチ」です。



ちょっと説明がザックリし過ぎましたかね。

それでは次に、実際のデータベースの話で見てみましょう。
データベースは「データを入れておく箱」ね。



前提として、データベースを検索したとき、検索結果として見つかるデータは1件とは限りません。
わちゃわちゃと、いっぱい見つかる場合もあります。

コンピュータさんは、この「わちゃわちゃ」を一度に処理するのが苦手です。
一度に処理しようとすると頭が痛くなっちゃいます。



そこでデータベースには、検索結果をとあるところに溜めておいて、そこから1件ずつ抜き出す仕組みが用意されています。

この仕組みがあれば、検索結果が何件でも大丈夫です。

検索結果が10件あれば、1件の処理を10回繰り返します。
検索結果が100件あれば、1件の処理を100回繰り返します。
検索結果が1,000件あれば、1件の処理を1000回繰り返します。

検索結果が10,000件あれば……まぁ、何件になろうと問題ありません。
1度に処理するのは「1件」です。

これなら、コンピュータさんは頭が痛くならなくて済みそうですね。

この「検索結果をとあるところに溜めておいて、そこから1件ずつ抜き出す仕組み」を「カーソル」と言います。



そして

検索結果から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;


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

FETCH ~

の部分がフェッチ処理です。
検索結果のかたまりから、1件のデータを取り出しています。

+ Recent posts