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