3

我有一个 SQL 查询,由不同的语句组成(这是一个简化版本,也会触发错误):

private static String getActiveKeyEventsSql =
        "SET @report_model_id = 2; " +
        "SELECT MAX(report_ts) AS report_ts " + 
        "FROM `pulse_data`.`key_event_reports` " + 
        "WHERE report_model_id = @report_model_id ";

我试图从我的 Java 应用程序中调用该语句:

public static void main(String[] args) throws Exception {
    MySQLLayer _db = new MySQLLayer();

    Connection _conn = null;
    try {
        _conn = _db.getConnection();
        PreparedStatement getActiveKeyEventsStmt = _conn.prepareStatement(getActiveKeyEventsSql);
        ResultSet rs = getActiveKeyEventsStmt.executeQuery();

        while (rs.next()) {
            LOG.info(rs.getLong("report_ts"));
        }
    } catch (SQLException e) {
        LOG.error("COULD NOT GET MAX REPORT.", e);
    } finally {
        try {
            if (_conn != null && !_conn.isClosed()) {
                _conn.close();
            }
        } catch (SQLException e) {
            LOG.info("COULD NOT CLOSE CONNECTION.", e);
        }
    }
}

但它会触发以下错误:

java.sql.SQLException: ResultSet is from UPDATE. No Data.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
    at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:6870)
    at com.stockpulse.stockstorm.sentiment.JavaTest.main(JavaTest.java:36)

在我的应用程序的其他地方,这个模式工作得很好。当我将此语句复制到 MySQL 控制台时,它工作得很好。

这是初始化数据库的字符串:

config.setJdbcUrl(
"jdbc:mysql://" + cred.getHOST() + "/" + cred.getDB()
+ "?allowMultiQueries=true&characterEncoding=utf-8&useUnicode=true&rewriteBatchedStatements=true&relaxAutoCommit=true"
);

为什么 JDBC 会突然出现这种行为?

4

1 回答 1

1

试着把你的陈述分解成

a = "SET @report_model_id = 2; ";
b = "SELECT MAX(report_ts) AS report_ts " + 
"FROM `pulse_data`.`key_event_reports` " + 
"WHERE report_model_id = @report_model_id ";

PreparedStatement.addBatch()为每个人做。

于 2013-06-07T17:41:13.660 回答