SQLServerには削除したり更新したりしたデータを返すOUTPUT句というものがあります。OUTPUT句の結果をJavaアプリケーション上で受け取りたい場合はPreparedStatement::executeQuery
を利用して、SQLを発行すれば良いです。OUTPUT句はDELETE文やUPDATE文で利用しますが、通常DELETE文やUPDATE文の発行に利用するPreparedStatement::executeUpdate
ではOUTPUT句の結果を受け取れないことに注意する必要があります。
未検証ですが、データベース接続に何らかのライブラリを使う場合は、通常SELECT文を発行するためのAPIを用いて、OUTPUT句を含むDELETE文なりUPDATE文なりを発行すればよいかと思われます。
以下は従業員の情報を格納するemployees
テーブルからidが2と4の従業員を削除しつつ、その削除した従業員のidと名前と入社日を取得するサンプルです。
String sql = """
DELETE FROM employees
OUTPUT DELETED.id, DELETED.name, DELETED.hiredate
WHERE id IN (2, 4)
""";
String url = "jdbc:sqlserver://localhost;encrypt=false";
String username = "sa";
String password = "1234@Hoge";
try (Connection con = DriverManager.getConnection(url, username, password)) {
PreparedStatement pstmt = con.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
Date age = rs.getDate("hiredate");
doSomething(id, name, age);
}
} catch (SQLException e) {
e.printStackTrace();
}
環境情報
- Java17
- mssql-jdbc-10.2.1.jre17.jar
SQLServerはDockerを利用して起動。詳細なバージョンは以下の通り
Microsoft SQL Server 2019 (RTM-CU9) (KB5000642) - 15.0.4102.2 (X64)
Jan 25 2021 20:16:12
Copyright (C) 2019 Microsoft Corporation
Developer Edition (64-bit) on Linux (Ubuntu 18.04.5 LTS) <X64>