如何在JDBC中获取受UPDATE查询影响的所有行?

时间:2016-04-07 13:38:35

标签: java mysql postgresql jdbc

我有一项任务,我需要使用PreparedStatement更新记录。一旦记录更新,因为我们知道更新查询返回计数,即受影响的行数。

但是,我需要响应更新查询的行,而不是计数,或者至少是受影响的行的id值列表。

这是我的更新查询。

UPDATE  User_Information uInfo SET address = uInfo.contact_number || uInfo.address where uInfo.user_id between ? AND ?;

通常它会返回受影响的行数,但在我的情况下,查询应该返回行的ID或受影响的所有行。

我使用了PostgreSQL的returning函数它正在工作但在这种情况下对我没用。

2 个答案:

答案 0 :(得分:4)

  

我使用了PostgreSQL的返回功能,但对我没用;

应该是。也许你只是错误地使用它。这段代码适合我:

import subprocess

x = subprocess.check_output((["python", "aa.py"]))
y = subprocess.check_output((["python", "bb.py"]))
print(x)
print(y)

documentation表示如果我们希望ResultSet包含整个更新的行,我们也可以使用sql = "UPDATE table1 SET customer = customer || 'X' WHERE customer LIKE 'ba%' RETURNING id"; try (PreparedStatement s = conn.prepareStatement(sql)) { s.execute(); // perform the UPDATE try (ResultSet rs = s.getResultSet()) { // loop through rows from the RETURNING clause while (rs.next()) { System.out.println(rs.getInt("id")); // print the "id" value of the updated row } } }

<强>更新

正如@CraigRinger在他的评论中所说,PostgreSQL JDBC驱动程序实际上也支持UPDATE语句的RETURNING *,所以这段代码也适用于我:

.getGeneratedKeys()

谢谢,克雷格!

答案 1 :(得分:3)

您可以使用JDBC的支持来获取生成的密钥。请参阅Connection.prepareStatement(String sql, int[] columnIndexes) API方法,然后使用Statement.getGeneratedKeys()访问结果。

规范说“如果SQL语句不是INSERT语句”,驱动程序将忽略该数组但我认为PostgreSQL的JDBC驱动程序实际上也会使用其他语句类型来表示您的请求

e.g。

PreparedStatement s = conn.prepareStatement(sql, new String[] {'id'})
s.executeUpdate();
ResultSet rs = s.getGeneratedKeys();

否则,请使用RETURNING,正如Gord Thompson所描述的那样。