MySQL - java.sql.SQLException:ResultSet来自UPDATE.没有数据

Ran*_*rer 1 java mysql jdbc

public static void main(String args[])
    {

            SQLConnector sqlConnect = new SQLConnector();
            Connection conn = null;
            try
            {
            conn= sqlConnect.getConnection();
            CallableStatement cStmt = conn.prepareCall("{ call test(?,?,?)}");
            cStmt.setDouble(1, 100.0);
            cStmt.setInt(2, 1);
            cStmt.registerOutParameter(3, java.sql.Types.VARCHAR);
            ResultSet rs = cStmt.executeQuery();
            if (rs.next()) {
                System.out.println(rs.getString(3);
                }
            cStmt.execute();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                sqlConnect.closeConnection(conn);
            }
        }
Run Code Online (Sandbox Code Playgroud)

此代码段会引发错误

java.sql.SQLException: ResultSet is from UPDATE. No Data.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
Run Code Online (Sandbox Code Playgroud)

但是,如果我从MySQL Workbench传递相同的参数,它会提供适当的输出.

我正在使用MySQLServer 5.6.25和MySQLConnector 5.1.6.

请帮我解决这个问题.这看起来像我从Java调用MySQL的方式中的错误

And*_*eas 5

请参阅此MySQL文档页面的第4部分:使用JDBC CallableStatements执行存储过程.

你不用executeQuery().你必须使用execute()getResultSet().

由于您知道该语句将返回一个ResultSet,因此您的代码将变为:

cStmt.execute();
try (ResultSet rs = cStmt.getResultSet()) {
    if (rs.next())
        System.out.println(rs.getString(3));
}
Run Code Online (Sandbox Code Playgroud)

除了当然你可能是错的,因为调用不返回结果集,而是在输出参数中返回一个字符串,这完全改变了代码:

cStmt.execute();
System.out.println(cStmt.getString(3));
Run Code Online (Sandbox Code Playgroud)