我有一项任务,我需要使用PreparedStatement
更新记录。一旦记录更新,因为我们知道更新查询返回计数,即受影响的行数。
但是,我需要响应更新查询的行,而不是计数,或者至少是受影响的行的id值列表。
这是我的更新查询。
UPDATE User_Information uInfo SET address = uInfo.contact_number || uInfo.address where uInfo.user_id between ? AND ?;
通常它会返回受影响的行数,但在我的情况下,查询应该返回行的ID或受影响的所有行。
我使用了PostgreSQL的returning
函数它正在工作但在这种情况下对我没用。
答案 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所描述的那样。