Wie in der Aktualisierung der Frage angegeben, wird dies häufig durch die falsche Verwendung eines CallableStatements verursacht. Zum Beispiel:
Stored Procedure verwendet 2 Parameter, einen in und einen out:
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
aber der Aufruf verwendet nur 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;
}
Wenn der richtige Code wirklich lautet:
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;
}
Beachten Sie, dass ich auch zu cs.execute gewechselt habe, da ich keine Ergebnismenge erwarte und auch Probleme damit hätte (das Beispiel stammt aus dem Code eines anderen, den ich gerade behebe, die Freuden -_-)