基本情報技術者試験 (FE) 科目 A — データベース
埋込みSQL とカーソル
埋込みSQL は他のプログラム言語のソースに SQL を直接書く方式。カーソルは複数行の問合せ結果に位置を持たせ、FETCH で 1 行ずつ取り出して変数に受け取る仕組み。
このレッスンは解説のみです
埋込みSQL は C や Java などのホスト言語があって初めて成立するため、 このツールでは実行できません。試験では書式より「なぜこの仕組みが要るのか」が問われるので、 そこを中心に解説します。
SQL の使われ方は 2 通りある
| 方式 | 呼び方 | 使い方 |
|---|---|---|
| 独立言語方式 | 会話型SQL | 端末から SQL を直接打ち込んで結果を見る |
| 親言語方式 | 埋込みSQL / モジュール言語 | 他の言語のプログラムから SQL を使う |
このページの Playground は会話型SQL に相当します。 アプリケーションから使う場合は親言語方式になります。
なぜカーソルが必要になるのか
ここが本質です。SQL と手続き型言語では「一度に扱える量」が違います。
- SQL の SELECT は複数行の集合を返す
- C や Java の変数は1 つの値しか持てない
100 行返ってきた結果を、変数 1 つには入れられません。 そこで結果に「今どの行を見ているか」という位置を持たせ、 1 行ずつ取り出す仕組みが用意されました。これがカーソルです。
科目 B の擬似言語で配列をfor で 1 要素ずつ回すのと同じ発想です。
カーソルの 4 つの命令
DECLARE 商品カーソル CURSOR FOR
SELECT 商品番号, 商品名 FROM 商品 WHERE 分類 = 'A';
OPEN 商品カーソル; -- 問合せを実行し、先頭の手前に位置づける
FETCH 商品カーソル INTO :番号, :名前; -- 1 行取り出して変数へ
CLOSE 商品カーソル; -- 使い終わったら閉じる- DECLARE — どの問合せに対するカーソルかを宣言する
- OPEN — 問合せを実行する
- FETCH — 1 行取り出してホスト変数に入れる。繰り返し呼ぶ
- CLOSE — 閉じる
:番号 のようにコロンが付いているのがホスト変数(ホスト言語側の変数)です。SQL の中で参照するときにコロンを付けて区別します。
取り出す行が無くなったら
FETCH を繰り返して最後の行を超えると、「もう行が無い」ことを示す状態が返ります (SQLSTATE や SQLCODE で判定します)。 プログラム側はこれを見てループを抜けます。
1 行しか返らないならカーソルは要らない
SELECT 商品名 INTO :名前 FROM 商品 WHERE 商品番号 = 'P01'主キーで 1 行に決まる場合は SELECT ... INTO で 直接ホスト変数に受け取れます。カーソルが必要なのは、結果が複数行になりうるときだけです。
試験で問われるポイント
- カーソルが必要な理由。 「SQL は集合を返すが、手続き型言語は 1 行ずつしか扱えない」
- DECLARE → OPEN → FETCH → CLOSE の順序
- 会話型SQL(独立言語方式)と埋込みSQL(親言語方式)の区別
- ホスト変数にコロンを付けること
よくある疑問
自由に試す / 他のレッスンを読む
データベース分野をもっと学ぶ(おすすめ書籍)
イラスト主体で科目Aの全範囲を通読できる入門書。用語の土台を作ってから科目Bのアルゴリズムに入ると理解が速い。
科目Aの頻出テーマを図と語呂で押さえる入門書。参考書と問題集を兼ねるので初受験の一冊目に選びやすい。
公開問題を大量に解いて仕上げるための問題集。擬似言語の読解に慣れた後、本番形式で時間配分を試す段階で使う。
本セクションはAmazonアソシエイトのリンクを含みます。
プログラムの読み方でつまずいたら。
たいてっくが、アルゴリズムの追い方から SQL・データベース設計まで、1対1で学習をサポートします。「コードを目で追っても何をしているか分からない」段階からで大丈夫です。まずは無料相談から。
「教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。」
— H 様(DB・SQL コース受講)「体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。」
— M 様(DB・SQL コース受講)「大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。」
— K 様(DB・SQL コース受講)