フェッチ【DB】
検索結果から1件取り出すよ
データベース関連の話で出てくるよ
簡単に書くよ
フェッチ【DB】(英:fetch)とは
データベースの検索結果から1件抜き出すこと
です。
詳しく書くよ
最初に留意事項です。
フェッチを理解しようと思ったら「カーソル」から勉強した方が分かりやすいと思います。
余裕がある方は「カーソル」の説明からご覧ください。
面倒くさい方は、そのまま読み進めていただいても結構です。
簡単にですが、カーソルの説明も書いておきます。
それでは、いってみましょう。
サクっと一言で説明すると
検索結果から1件取り出す
のが「フェッチ」です。
例えば、そうですね。
ピヨ太君がピヨピヨ検索エンジンで美味しい肉まんの作り方を検索しました。
条件に一致する情報が10件見つかりました。
ピヨ太君は見つかった検索結果の中から1つ選んで中を見ました。
この話においてピヨ太君がやった「見つかった検索結果から1つ選んで中を見る」行為がフェッチ(のイメージ)です。
それでは次に、実際のデータベースの話で見てみましょう。
ちなみにデータベースは「データを入れておく箱」ね。
前提として、データベースを検索したとき、検索結果として見つかるデータは1件とは限りません。
わちゃわちゃと、いっぱい見つかる場合があります。
コンピュータさんは、この「わちゃわちゃ」を一度に処理するのが苦手です。
一度に処理しようとすると頭が痛くなっちゃいます。
そこでデータベースには、検索結果をとあるところに溜めておいて、そこから1件ずつ抜き出す仕組みが用意されています。
この仕組みがあれば、検索結果が何件でも大丈夫です。
検索結果が10件あれば、1件の処理を10回繰り返します。
検索結果が100件あれば、1件の処理を100回繰り返します。
検索結果が1,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件のデータを取り出する処理です。
一言でまとめるよ
まぁ「フェッチ」って単語が出てきたら「データベースの検索結果から1件抜き取るんだな~」と お考えください。
おまけ
■訳してみるよ
「fetch(フェッチ)」の意味は
・(行って)取ってくる
・連れてくる
・引き出す
とかです。
「取ってくる」が近いですかね。






