जैसा कि प्रश्न के अद्यतन में कहा गया है, यह आमतौर पर कॉल करने योग्य स्टेटमेंट का गलत तरीके से उपयोग करने के कारण होता है। उदाहरण के लिए:
संग्रहित प्रक्रिया 2 मापदंडों का उपयोग करती है, एक अंदर और एक बाहर:
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
लेकिन इसके लिए कॉल केवल 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;
}
जब सही कोड वास्तव में हो:
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;
}
ध्यान दें कि मैं भी cs.execute में बदल गया हूं क्योंकि मुझे परिणाम सेट की उम्मीद नहीं है और इसके साथ भी समस्याएं होंगी (उदाहरण किसी और के कोड से लिया गया है जिसे मैं ठीक कर रहा हूं, जॉय -_-)