我正在尝试使用JDBC并使用以下命令查询数据库
CallableStatement call_state =null;
call_state =con.prepareCall("UPDATE district SET d_next_o_id = ?+1 WHERE d_id = ? AND d_w_id = ?");
call_state.setInt(1, d_next_o_id);
call_state.setInt(2, d_id);
call_state.setInt(3, d_w_id);
rs=call_state.executeQuery();`
我遇到了一个异常:java.sql.SQLException:无法提交空查询。
答案 0 :(得分:3)
即使CallableStatement
(CS)是“用于执行SQL存储过程的接口”,它也是PreparedStatement
的子接口。出于这个原因,任何遵守Liskov Substitution Principle的CS实现也应该能够执行正常的UPDATE
,SELECT
或DELETE
操作(任何简单的PreparedStatement
可以做。)
您的代码的实际问题出在您提供的代码段的最后一行;您在UPDATE
语句中使用executeQuery()
,这不起作用。相反,您应该使用execute()
或executeUpdate()
。所以将该行改为
call_state.executeUpdate();
应该有用。
如果您想“正确”执行此操作,则应该是惯用的并使用PreparedStatement
而不是CallableStatement
- 因为您没有调用任何存储过程。此外,您应该使用try-with-resources statement:
try (PreparedStatement ps = con.prepareStatement(
"UPDATE district SET d_next_o_id = ?+1 WHERE d_id = ? AND d_w_id = ?")) {
ps.setInt(1, d_next_o_id);
ps.setInt(2, d_id);
ps.setInt(3, d_w_id);
ps.executeUpdate();
} catch (SQLException e) {
// handle it
}