晦涩的MySql Connector/J错误信息 - java.sql.SQLException:boo {惊叹号}

4
这个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开发团队提出这个建议。


1
有人定制了错误信息,我猜! - AllTooSir
1
我已经升级到mysql-connector-java-5.1.25,但错误信息仍然相同。从Java访问存储过程肯定不是边缘情况。 - eddyoc
你有尝试搜索整个代码库中是否包含单词"boo!"吗?我很难相信Java开发人员会发布带有"boo!"信息的代码。 - chrislondon
2
我也是 - 然而它就在那里... - eddyoc
我也遇到了同样的问题。有人找出是什么问题了吗? - csotiriou
1个回答

3

如问题更新中所述,这通常是由于使用CallableStatement不正确引起的。例如:

存储过程使用两个参数,一个传入参数和一个传出参数:

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,因为我不期望有结果集,并且这也会带来问题(这个示例是我正在修复的某人的代码,真是太棒了 -_-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接