最終更新日:2026年7月28日
fe fe-technology database sql
まず結論
SQLカーソルは、SQLの問い合わせ結果を1行ずつ取り出し、親プログラムで順番に処理するための仕組みです。
基本情報技術者試験では、次の表現を見たらカーソルを疑います。
複数行の検索結果
↓
1行ずつ取り出す
↓
親プログラムで処理する
試験直前には、次の一文を判断軸にします。
検索結果を1行ずつ読むならカーソル。
直感的な説明
SQLは、表のデータをまとめて検索・更新するのが得意です。
一方、C、COBOL、Javaなどの手続き型プログラムでは、処理を1件ずつ順番に進めることがあります。
SQL
→ 複数行をまとめて返す
親プログラム
→ 1行ずつ順番に処理したい
この違いをつなぐのがカーソルです。
カーソルは、検索結果の中で「今どの行を見ているか」を管理します。
1行目を取得
↓
2行目へ移動
↓
2行目を取得
↓
3行目へ移動
つまり、カーソルはSQLの検索結果と手続き型プログラムを橋渡しする仕組みです。
定義・仕組み
埋込みSQLとは
埋込みSQLとは、C、COBOL、Javaなどのプログラムの中へSQL文を組み込み、関係データベースを操作する方法です。
親プログラムからSQLを実行し、検索結果を変数へ受け取って、その後の処理に使います。
検索結果が1行だけなら、値を変数へ直接受け取れます。
しかし、検索結果が複数行になると、1回の受取りだけでは扱えません。
そこでカーソルを使い、結果を1行ずつ取り出します。
カーソル処理の基本手順
カーソル処理は、一般に次の流れで進みます。
DECLARE CURSOR
↓
OPEN
↓
FETCH
↓
FETCH
↓
CLOSE
| 操作 | 役割 |
|---|---|
| DECLARE CURSOR | カーソルと問い合わせを定義する |
| OPEN | 問い合わせを実行し、結果を利用できる状態にする |
| FETCH | 結果から1行を取り出し、次の行へ進む |
| CLOSE | カーソルを閉じる |
DECLARE CURSOR
DECLARE CURSORでは、カーソル名と検索に使うSELECT文を定義します。
DECLARE employee_cursor CURSOR FOR
SELECT employee_id, employee_name
FROM employee;
この段階では、カーソルの使い方を定義しているだけです。
OPEN
OPENでカーソルを開き、問い合わせ結果を取り出せる状態にします。
OPEN employee_cursor;
FETCH
FETCHで、検索結果を1行ずつ親プログラムの変数へ受け取ります。
FETCH employee_cursor
INTO :employee_id, :employee_name;
FETCHを繰り返すことで、次の行へ順番に進みます。
1回目のFETCH
→ 1行目
2回目のFETCH
→ 2行目
3回目のFETCH
→ 3行目
CLOSE
処理が終わったら、CLOSEでカーソルを閉じます。
CLOSE employee_cursor;
不要になったカーソルを閉じることで、使用していた資源を解放します。
科目Aでどう出る?
用語の切り分け
科目Aでは、カーソルと他のSQL用語を区別させる問題が出ます。
| 問題文・選択肢の表現 | 選びたい用語 |
|---|---|
| 検索結果を1行ずつ取り出す | CURSOR |
| 1行を親プログラムへ受け渡す | FETCH |
| 検索結果を並べ替える | ORDER BY |
| 複数の問い合わせ結果をまとめる | UNION |
| 列の重複を許さない | UNIQUE |
特に重要なのは、次の切り分けです。
仕組み全体
→ CURSOR
1行を取り出す操作
→ FETCH
問題文の目印
次の表現があれば、カーソルを疑います。
- 導出表を1行ずつ処理する
- 検索結果を親プログラムへ順番に渡す
- 埋込みSQLを使う
- 手続き型プログラムから問い合わせ結果を処理する
DECLARE CURSORやFETCHが登場する
解く順番
このタイプの問題では、次の順で考えると判断しやすくなります。
1. 問い合わせ結果は複数行か
2. 1行ずつ処理する必要があるか
3. 親プログラムへ渡すのか
4. その場合はカーソルを選ぶ
どんな場面で使う?
検索結果を1件ずつ処理する
例えば、社員一覧を検索し、社員ごとに個別の処理を行う場合です。
社員を検索
↓
1人目を処理
↓
2人目を処理
↓
3人目を処理
行ごとに異なる処理を行う
検索結果の各行について、別の計算、条件判定、外部処理などを行う場合に使います。
一括処理できない場合に使う
SQLでは、可能なら表全体をまとめて処理する方が効率的です。
しかし、親プログラム側で1行ずつ扱う必要がある場合には、カーソルを使います。
まとめて処理できる
→ SQLで一括処理
1行ずつ個別処理が必要
→ カーソル
よくある誤解・混同
CURSORとFETCHは同じ
同じではありません。
CURSOR
→ 複数行の検索結果を順番に扱う仕組み
FETCH
→ カーソルから1行を取り出す操作
問題で「操作全体」を聞かれているならCURSOR、「1行を取得する命令」を聞かれているならFETCHです。
ORDER BYは1行ずつ並べる機能
誤りです。
ORDER BYは、検索結果の並び順を指定する句です。
昇順・降順に並べる
→ ORDER BY
1行ずつ取得する
→ CURSOR / FETCH
UNIONは検索結果を順番に処理する機能
誤りです。
UNIONは、複数のSELECT文の結果を一つにまとめます。
複数の検索結果を結合
→ UNION
検索結果を逐次処理
→ CURSOR
UNIQUEは重複行を除く検索句
UNIQUEは、主に列の値の重複を許さない制約です。
DBMSによっては検索結果の重複排除に似た表現が使われる場合もありますが、FE試験では次のように切り分けます。
列の重複を禁止
→ UNIQUE
検索結果を1行ずつ処理
→ CURSOR
カーソルは常に使うべき
誤りです。
SQLで一括処理できるなら、カーソルを使わずにまとめて処理した方が効率的なことがあります。
カーソルは、1行ずつ個別に処理する必要がある場合に使います。
まとめ(試験直前用)
- カーソルは、複数行の検索結果を1行ずつ扱う仕組み
- 埋込みSQLで、検索結果を親プログラムへ順番に渡す
DECLARE CURSORで定義し、OPENで開始するFETCHで1行ずつ取得し、CLOSEで終了するORDER BYは並べ替え、UNIONは結果結合、UNIQUEは重複禁止- 仕組み全体は
CURSOR、1行取得の操作はFETCH
試験直前には、次の一文を思い出してください。
SQLの検索結果を親プログラムで1行ずつ読むならカーソル。