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件のデータを取り出しています。
'DataBase > DataBase Basic' 카테고리의 다른 글
connection pool, why use connection pool, how to control db connection per sql (0) | 2021.08.07 |
---|---|
제약조건(Constraint), 제약조건의 종류, 컬럼에 제약 설정하기, 테이블에 제약설정하기 (0) | 2021.07.04 |
기본키 이해하기, 기본키의 예시, 기본키를 사용하면 무엇이 좋은가 (0) | 2021.07.04 |
외래키 이해하기, 외래키의 예시, 외래키를 사용하면 무엇이 좋은가? (0) | 2021.07.04 |
DBMS별 Schema(스키마) 와 Database와 차이점 (0) | 2021.07.04 |