# Question03 - 更新系SQL(登録) 本資料の練習問題は、複数のプログラミング言語(Java / PHP / C# / Python)で共通して利用できるよう記述されています。使用するデータベース接続の仕組み(JDBC、PDO、ADO.NET、DB-API 2.0準拠のドライバ など)やSQLへのパラメータの指定方法、自動採番された値の取得方法など、言語・環境固有の仕様に基づき、問題文の表現をご使用の環境の仕様に適宜読み替えて進めてください。 [共通の前提](../00.共通前提.md)を参照してください。 ## この問題のねらい - データベースに新しいデータを登録するSQLを実行できること - 登録時に自動的に採番される値(主キー)の扱いを理解する - 登録した内容が実際にデータベースへ反映されていることを、検索によって確認できること 以下の設問はそれぞれ独立したプログラムとして実装してください。 ## ファイル名・フォルダ構成 - 設問ごとに1つのフォルダを作成し、そのフォルダの直下にプログラムのファイルを配置すること。 - フォルダ名は、設問番号に対応した連番(`question01`、`question02`、…)とすること(全言語共通・小文字)。 - ファイル名は、設問番号に対応した連番(`Question01`、`Question02`、…)を基本とし、言語の慣習に合わせて次のとおりとすること。 - 本問題(Question03-Insert)の構成は次のとおり。 ``` Question03-Insert/ ├── question01/    ← 設問1 │ └── Question01.<拡張子> ├── question02/    ← 設問2 │ └── Question02.<拡張子> └── question03/    ← 設問3 └── Question03.<拡張子> ``` - Java: `Question01.java`(公開クラス名もファイル名と同じ `Question01` とする) - C#: `Question01.cs` - PHP: `Question01.php` - Python: `question01.py`(モジュール名は小文字とする慣習のため、ファイル名のみ小文字) - 上記ツリー中の `Question01.<拡張子>` は、使用する言語に応じて上記のファイル名に読み替えること。 - プロジェクトファイルが必要な場合など、言語・開発環境の規則上やむを得ない場合は、その規則を優先してよい。その場合も、設問ごとのフォルダ分けと連番の命名は維持すること。 - 設問内で追加で作成するクラス・関数などは、その設問のフォルダ直下に配置すること。 - 他の設問で作成したクラス等を使用する設問では、各フォルダ単独で実行できるよう、そのフォルダ直下にも同じ内容を配置すること。 ## 実行例の部署IDについて - 各設問の実行例に示す部署ID(`6`、`7` など)は、テーブル作成用SQL([共通の前提](../00.共通前提.md)を参照)を実行して部署テーブルを作り直した直後に、その設問を初めて実行した場合の値です。 - 自動採番される値は、登録したデータを削除しても元に戻りません。テーブルを作り直さずに登録を繰り返した場合や、別の設問で登録した後に実行した場合は、実行例よりも大きい部署IDが採番されます。 - このように部署IDの数字だけが実行例と異なる場合でも、次の点を満たしていれば正しく実装できています。 - 部署IDを指定せずに登録しており、既存のデータと重複しない部署IDが自動的に採番されていること - 確認のための検索で、登録した部署名とその部署IDが出力されること - 実行例と同じ部署IDで確認したい場合は、テーブル作成用SQLを実行し直してから、各設問を実行してください。 --- ## 設問1 標準入力から部署名を受け取り、部署テーブルに新しいデータとして登録するプログラムを実装してください。 ### 要件 - 「登録する部署名を入力してください」と表示し、標準入力から部署名を読み込むこと - 部署IDは指定せず、登録時に自動的に採番される値を使用すること - 部署名の登録には、SQLに値を直接埋め込むのではなく、パラメータとして値を渡す仕組みを使用すること - 登録が完了したら、「登録完了」と出力すること - 登録完了の出力に続けて、「確認のため、検索する部署名を入力してください」と表示し、標準入力から部署名を読み込んだうえで、その部署名に一致する部署のデータを部署テーブルから検索し、検索結果(部署ID・部署名)をタブ区切りで出力すること(登録内容がデータベースに反映されていることを、自分で検索して確認できるようにする)。該当するデータが存在しない場合は、「一致する部署は見つかりませんでした」と出力すること ### 実行例 - 「登録する部署名を入力してください」と表示された後に `広報部` と入力した場合 - 出力:`登録完了` - 続けて「確認のため、検索する部署名を入力してください」と表示された後に `広報部` と入力した場合 - 出力:`6 広報部` --- ## 設問2 標準入力から部署名を3件連続で受け取り、3件とも部署テーブルにまとめて登録するプログラムを実装してください。 ### 手順・要件 1. 「1件目の部署名を入力してください」「2件目の部署名を入力してください」「3件目の部署名を入力してください」と、この順に1件ずつ表示し、それぞれ標準入力から部署名を読み込む 2. 読み込んだ3件の部署名を、この順で部署テーブルに登録する 3. 部署IDはいずれも指定せず、登録時に自動的に採番される値を使用すること 4. 部署名の登録には、SQLに値を直接埋め込むのではなく、パラメータとして値を渡す仕組みを使用すること 5. 3件とも登録が完了したら、「3件登録完了」と出力する 6. 続けて、「確認のため、検索する部署名を入力してください」と表示し、標準入力から部署名を読み込んだうえで、その部署名に一致する部署のデータを部署テーブルから検索し、検索結果(部署ID・部署名)をタブ区切りで出力すること(登録内容がデータベースに反映されていることを、自分で検索して確認できるようにする)。該当するデータが存在しない場合は、「一致する部署は見つかりませんでした」と出力すること ### 実行例 - 1件目に `広報部`、2件目に `法務部`、3件目に `経理部` と入力した場合 - 出力:`3件登録完了` - 続けて「確認のため、検索する部署名を入力してください」と表示された後に `法務部` と入力した場合 - 出力:`7 法務部` --- ## 設問3 標準入力から部署名を受け取り、部署テーブルに新しいデータとして登録するプログラムを実装してください。ただし、同じ部署名が既に登録されている場合は、登録を行わないようにしてください。 ### 手順・要件 1. 「登録する部署名を入力してください」と表示し、標準入力から部署名を読み込む 2. 読み込んだ部署名と一致するデータが、部署テーブルに既に存在するかどうかを検索する。この際、SQLに値を直接埋め込むのではなく、パラメータとして値を渡す仕組みを使用すること 3. 既に存在する場合、登録は行わず、「(部署名)は既に登録されています」と出力する 4. 存在しない場合、部署IDを指定せず(自動的に採番される値を使用して)新しいデータとして登録し、「登録完了」と出力する 5. 手順4で登録した場合は、続けて「確認のため、検索する部署名を入力してください」と表示し、標準入力から部署名を読み込んだうえで、その部署名に一致する部署のデータを検索し、検索結果(部署ID・部署名)をタブ区切りで出力すること(登録内容がデータベースに反映されていることを、自分で検索して確認できるようにする)。手順3で登録を行わなかった場合、この確認のための検索は行わない ### 実行例 - `広報部`(未登録の部署名)と入力した場合 - 出力:`登録完了` - 続けて「確認のため、検索する部署名を入力してください」と表示された後に `広報部` と入力した場合 - 出力:`6 広報部` - `営業部`(既に登録されている部署名)と入力した場合 - 出力:`営業部は既に登録されています`