Như đã nêu trong bản cập nhật cho câu hỏi, điều này thường xảy ra do sử dụng không đúng CallableStatement. Ví dụ:
Thủ tục lưu trữ sử dụng 2 tham số, một vào và một ra:
CREATE DEFINER=`example`@`localhost` PROCEDURE `sp_getSensorLocation`(IN in_id VARCHAR(128), OUT loc VARCHAR(128))
BEGIN
SELECT LOCATION INTO loc FROM table.SENSORS
WHERE ID = in_id;
END
nhưng lệnh gọi nó chỉ sử dụng 1:
private String getSensorLocation(String sensorID) {
String location = "";
Connection c = dbr.getConnection();
String prepStatement = "{ call sp_getSensorLocation(?) } ";
try {
callableStatement cs = c.prepareCall(prepStatement);
cs.setString(1, sensorID);
ResultSet rs = cs.executeQuery();
if (rs.next()) {
location = rs.getString(1);
}
} catch (SQLException ex) {
LOG.error("Error:", ex);
}
dbr.closeConnection(c, rs, cs);
return location;
}
Khi mã chính xác thực sự là:
private String getSensorLocation(String sensorID) {
String location = "";
Connection c = dbr.getConnection();
String prepStatement = "{ call sp_getSensorLocation(?, ?) } ";
try {
CallableStatement cs = c.prepareCall(prepStatement);
cs.setString(1, sensorID);
cs.execute();
location = cs.getString(2);
} catch (SQLException ex) {
LOG.error("Error:", ex);
}
dbr.closeConnection(c, rs, cs);
return location;
}
Lưu ý rằng tôi cũng đã thay đổi thành cs.execute vì tôi không mong đợi một tập hợp kết quả và cũng sẽ gặp vấn đề với điều này (ví dụ được lấy từ mã của người khác mà tôi đang sửa, niềm vui -_-)