基本情報技術者 2018年 春期 午前(科目A) 問28
問題文
次の埋込みSQLを用いたプログラムの一部において、Xは何を表す名前か。
EXEC SQL OPEN X;
EXEC SQL FETCH X INTO :NAME, :DEPT, :SALARY;
EXEC SQL UPDATE従業員
SET給与 = 給与* 1.1
WHERE CURRENT OF X;
EXEC SQL CLOSE X;
選択肢
ア:カーソル(正解)
イ:スキーマ
ウ:テーブル
エ:ビュー
🔒 解説は解答すると表示されます
カーソル操作【午前解説】
正解の理由
正解は ア(カーソル)です。与えられたコードは典型的な埋込みSQLのカーソル操作を示しています。手順としては
- EXEC SQL OPEN X; でカーソルXの結果集合を開く
- EXEC SQL FETCH X INTO :NAME, :DEPT, :SALARY; で現在行をホスト変数に取得する
- EXEC SQL UPDATE 従業員 SET 給与 = 給与 * 1.1 WHERE CURRENT OF X; で「カーソルXの現在行」を指定して当該行を更新する
- EXEC SQL CLOSE X; でカーソルを閉じる
この一連の流れは「カーソル」を操作する典型例であり、Xはカーソル名以外に解釈できません。
解法ステップ
- SQLキーワードを確認する:OPEN、FETCH、WHERE CURRENT OF、CLOSE に注目する。
- 各キーワードの用途を思い出す:OPEN/FETCH/CLOSE はカーソル操作の基本であると認識する。
- WHERE CURRENT OF の意味を確認する:これは「カーソルの現在行」を指定する専用構文である。
- 選択肢と照合する:カーソル以外(スキーマ、テーブル、ビュー)はこれらの動作説明と一致しないため除外する。
選択肢別の誤答解説
- ア: カーソル — 正解。OPEN/FETCH/CLOSE と WHERE CURRENT OF はカーソル操作に固有の構文です。
- イ: スキーマ — 誤り。スキーマはデータベースのオブジェクト群の論理的な分類名であり、OPEN/FETCH と関連しません。
- ウ: テーブル — 誤り。テーブルはデータ集合だが、WHERE CURRENT OF はテーブル名でなくカーソルの位置を示すため一致しません。
- エ: ビュー — 誤り。ビューもテーブルのような仮想表だが、FETCH や CURRENT OF の対象名にはなりません(ビュー自身をカーソル名に使うことはできても、文脈上 X はカーソル名である必要があります)。
よくある誤解
- WHERE CURRENT OF が「テーブル名を参照している」と誤解する:実際には現在処理中のカーソルの行位置を指します。
- FETCH を単なる SELECT と混同する:FETCH は既にオープンされたカーソルから順次行を取り出す操作であり、単発の問い合わせとは用途が異なります。
- カーソルは必ず行ごと更新を必要とすると思い込む:多くの場合は集合演算(SETベース)の更新で置換可能で、パフォーマンス面で差が出ます。
補足コラム
埋込みSQLでカーソルを使う典型例(擬似コード):
EXEC SQL DECLARE X CURSOR FOR
SELECT 名, 部署, 給与 FROM 従業員 WHERE 条件 FOR UPDATE;
EXEC SQL OPEN X;
EXEC SQL FETCH X INTO :NAME, :DEPT, :SALARY;
EXEC SQL UPDATE 従業員
SET 給与 = 給与 * 1.1
WHERE CURRENT OF X;
EXEC SQL CLOSE X;
ポイント:
- UPDATE ... WHERE CURRENT OF を使う場合、多くのDBではカーソル宣言に FOR UPDATE が必要です。
- カーソルは行単位の処理が必要なときに便利ですが、大量行の更新は集合更新(例:UPDATE 従業員 SET 給与 = 給与 * 1.1 WHERE 条件)に比べて性能が劣ることが多いです。
- ホスト変数はコロン付き(:NAME)で表現され、FETCH によりアプリケーション側に行データが渡されます。
FAQ
Q1: WHERE CURRENT OF X は必ず使うべきですか?
A1: 行単位で「現在行」を確実に更新したい場合は有効ですが、可能なら集合更新の方が性能面で有利です。
A1: 行単位で「現在行」を確実に更新したい場合は有効ですが、可能なら集合更新の方が性能面で有利です。
Q2: FETCH と SELECT の違いは何ですか?
A2: SELECT はクエリ実行で結果集合を返す命令、FETCH は既に開いたカーソルから順次行を取り出す命令です。
A2: SELECT はクエリ実行で結果集合を返す命令、FETCH は既に開いたカーソルから順次行を取り出す命令です。
Q3: カーソル宣言はどこに書くべきですか?
A3: 埋込みSQLでは通常、プログラムのSQL文ブロック内で EXEC SQL DECLARE ... CURSOR FOR ... として宣言します。
A3: 埋込みSQLでは通常、プログラムのSQL文ブロック内で EXEC SQL DECLARE ... CURSOR FOR ... として宣言します。
Q4: WHERE CURRENT OF を使う際に注意する点は?
A4: カーソルが更新可能であること(FOR UPDATE 等)とトランザクションの整合性、ロックの影響に注意してください。
A4: カーソルが更新可能であること(FOR UPDATE 等)とトランザクションの整合性、ロックの影響に注意してください。
関連キーワード: 埋込みSQL、カーソル、OPEN、FETCH、WHERE CURRENT OF、CLOSE、ホスト変数、更新カーソル、トランザクション、FOR UPDATE

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

