java - 在语句中使用 sql 变量时突然出现 SQL 异常

标签 java mysql jdbc

我有一个 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 会突然这样?

最佳答案

试着把你的陈述分成

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()

关于java - 在语句中使用 sql 变量时突然出现 SQL 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16989850/

相关文章:

mysql - REGEXP 使用 MySQL 匹配字符串中的任一关键字

java - 如何在 Tomcat 7.0.47 启动时注册 oracle jdbc 驱动程序?

jdbc - 从命令行运行 clojure jar 的不一致

java - 将数据解析成表

mysql ‘显示为’

java - 如何创建位于 Java 方法中的类的对象?

java - 在服务器上运行 Shell 脚本

java - 将 T 和 T[] 的混合传递给 Java 可变参数方法

php - 错误: I want remove <option selected =""></option> tag,从数据库获取记录时自动添加

java - 更新到SDN 3.4.1后出现异常 "The Neo Server running is of unknown type."