基本情報技術者試験 (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 商品カーソル;             -- 使い終わったら閉じる
  1. DECLARE — どの問合せに対するカーソルかを宣言する
  2. OPEN — 問合せを実行する
  3. FETCH — 1 行取り出してホスト変数に入れる。繰り返し呼ぶ
  4. CLOSE — 閉じる

:番号 のようにコロンが付いているのがホスト変数(ホスト言語側の変数)です。SQL の中で参照するときにコロンを付けて区別します。

取り出す行が無くなったら

FETCH を繰り返して最後の行を超えると、「もう行が無い」ことを示す状態が返ります (SQLSTATE や SQLCODE で判定します)。 プログラム側はこれを見てループを抜けます。

1 行しか返らないならカーソルは要らない

SELECT 商品名 INTO :名前 FROM 商品 WHERE 商品番号 = 'P01'

主キーで 1 行に決まる場合は SELECT ... INTO で 直接ホスト変数に受け取れます。カーソルが必要なのは、結果が複数行になりうるときだけです。

試験で問われるポイント

  • カーソルが必要な理由。 「SQL は集合を返すが、手続き型言語は 1 行ずつしか扱えない」
  • DECLARE → OPEN → FETCH → CLOSE の順序
  • 会話型SQL(独立言語方式)と埋込みSQL(親言語方式)の区別
  • ホスト変数にコロンを付けること

よくある疑問

Q.なぜカーソルが必要なのですか?
A.SQL は「複数行の集合」を一度に返しますが、C や Java のようなプログラム言語の変数は 1 つの値しか持てません。この食い違いを埋めるため、結果に位置を持たせて 1 行ずつ取り出す仕組みがカーソルです。
Q.会話型SQL と埋込みSQL の違いは何ですか?
A.会話型SQL は端末から直接 SQL を打ち込んで結果を見る使い方(独立言語方式)です。埋込みSQL は他のプログラム言語のソースコードに SQL を書き込む使い方(親言語方式)で、結果をホスト言語の変数に受け取ります。
Q.1 行しか返らないと分かっている場合もカーソルが要りますか?
A.要りません。SELECT ... INTO でホスト変数に直接受け取れます。カーソルが必要になるのは、結果が複数行になりうる場合だけです。

自由に試す / 他のレッスンを読む

データベース分野をもっと学ぶ(おすすめ書籍)

本セクションはAmazonアソシエイトのリンクを含みます。

オンライン個別指導

プログラムの読み方でつまずいたら。

たいてっくが、アルゴリズムの追い方から SQL・データベース設計まで、1対1で学習をサポートします。「コードを目で追っても何をしているか分からない」段階からで大丈夫です。まずは無料相談から。

無料相談を予約する →
受講者の声 (DB・SQL コース)
menta レビュー原文を見る →
  • 教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。
    H 様DB・SQL コース受講
  • 体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。
    M 様DB・SQL コース受講
  • 大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。
    K 様DB・SQL コース受講