这个MySql错误消息的意思是什么?
java.sql.SQLException: boo!
springframework.dao.TransientDataAccessResourceException: CallableStatementCallback; SQL [{call sp_MyStoredProc(?, ?, ?)}]; boo!
这肯定不是特别有意义。有没有人遇到这个并且能够转化为不那么懒〜开发人员〜是......?
我通过org.springframework.jdbc.object.StoredProcedure
我正在使用org.springframework.jdbc-3.1.3
@Update
违规行在CallableStatetement.java(2269-2271)
中if (!found) {
throw SQLError.createSQLException("boo!", "S1000", this.connection.getExceptionInterceptor());`
}
附加mysql-connector-java-5.1.18.jar的源代码并通过代码跟踪显示正确的消息应该是“声明的参数和实际参数之间不匹配”或类似的行。
确实正确地声明了我的输出参数
declareParameter(new SqlOutParameter("output", Types.INTEGER));
而不是
declareParameter(new SqlParameter("output", Types.INTEGER));
解决了我的问题。但更有意义的错误信息可以节省宝贵的时间。我将向MySql Connector / J开发团队提出这个建议。
答案 0 :(得分:3)
如问题更新中所述,这通常是由于错误地使用CallableStatement引起的。例如:
存储过程使用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,因为我不期望结果集,并且也会遇到问题(这个例子来自我正在修复的其他人的代码,joys -_-)