コンソールアプリケーション:社員情報管理アプリ
DBController.java
//更新機能
public static void Javadoc_update(String empId ,String empName_up, String gender_up, String birthday_up, String deptId_up)
throws ClassNotFoundException, SQLException {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
//DBに接続
connection = DBManager.getConnection();
preparedStatement = connection.prepareStatement(ConstantSQL.SQL_UPDATE1);
preparedStatement.setString(1, empName_up);
preparedStatement.setString(2, gender_up);
preparedStatement.setString(3, birthday_up);
preparedStatement.setString(4, deptId_up);
preparedStatement.setString(5, empId);
//SQLの実行
preparedStatement.executeUpdate();
System.out.println("社員情報を更新しました");
} finally {
DBManager.close(preparedStatement);
DBManager.close(connection);
}
ConstantSQL.java
public class ConstantSQL {
//全てCASE文で記述した場合
public static String SQL_UPDATE1 = "UPDATE employee e SET \r\n"
+ "e.emp_name = (CASE WHEN e.emp_name IS NULL THEN e.emp_name WHEN e.emp_name IS NOT NULL THEN ? END),\r\n"
+ "e.gender = (CASE WHEN e.gender IS NULL THEN e.gender WHEN e.gender IS NOT NULL THEN ? END),\r\n"
+ "e.birthday = (CASE WHEN e.birthday IS NULL THEN e.birthday WHEN e.birthday IS NOT NULL THEN TO_DATE(?, 'YYYY-MM-DD') END),\r\n"
+ "dept_id = (CASE WHEN dept_id IS NULL THEN dept_id WHEN dept_id IS NOT NULL THEN ? END)\r\n"
+ "WHERE emp_id = ?";
//emp_nameのみCASE文で記述した場合
public static String SQL_UPDATE1 = "UPDATE employee e SET \r\n"
+ "e.emp_name = (CASE WHEN e.emp_name IS NULL THEN e.emp_name WHEN e.emp_name IS NOT NULL THEN ? END),\r\n"
+ "e.gender = ?, \r\n"
+ "e.birthday = ?, \r\n"
+ "dept_id = ?\r\n"
+ "WHERE emp_id = ?";
}
CASE文の説明
--CASEで条件をわけてSELECTする
SELECT
CASE
WHEN 条件1 THEN 条件1の結果
WHEN 条件2 THEN 条件2の結果
ELSE 条件1,2以外の結果
END
FROM table1;
全てCASE文で入力したとき
エラー文
java.sql.SQLSyntaxErrorException: ORA-00932:
データ型が一致しません: NUMBERが予想されましたがCHARです。
値を入力して更新しても入力しないで更新しても上記のエラーになる。
emp_nameのみCASE文で記述した場合
エラー文
java.sql.SQLException: ORA-01407:
("CONSOLE_CRUD_USER"."EMPLOYEE"."EMP_NAME")をNULLには更新できません。
値を入力しないで更新しないと上記のエラーになる。
ただしemp_nameに値を入れて更新するとエラーは発生せず更新できる。
別のパターン
同じようにbirthdayのみ、genderのみ、dept_idのみCASE文で記述した場合
エラー文
java.sql.SQLSyntaxErrorException: ORA-00932:
データ型が一致しません: NUMBERが予想されましたがCHARです。
いずれの場合も値を入力しないと上記のエラーになる。
または値を入力した場合にも同様のエラーになる。