【问题标题】:ResultSet is from UPDATE. No Data结果集来自 UPDATE。没有数据
【发布时间】:2017-05-17 21:56:16
【问题描述】:

executeQuery 函数运行时出现问题,sql 语句工作正常,在 sql 编辑器上运行时给出正确的结果。当它在 jdbc 上运行时,它不会被执行。该连接接受多个查询。

String query = "set @countOfLectureGrade = (SELECT Count(goc.Affect) FROM GradeOfCourse goc WHERE goc.LectureID = ?);" 
                + "SELECT u.SchoolID, u.Name, u.Surname, u.Role, u.Email, " 
                + "CASE WHEN @countOfLecture = 0 then 0 " 
                + "ELSE AVG(0.01 * goc.Affect * gos.Grade) " 
                + "END AS Average "  
                + "FROM GradeOfCourse goc, GradeOfStudent gos, User u, CourseOfStudent cos "
                + "WHERE " 
                + "(gos.CourseGradeID = goc.GradeID AND u.SchoolID = gos.StudentID AND goc.LectureID = ?) " 
                + "OR (u.SchoolID = cos.SchoolID AND cos.LectureID = ? AND @countOfLectureGrade = 0) " 
                + "GROUP BY u.SchoolID;";


try {
    connection = super.getConnection();
    PreparedStatement sqlStatement = connection.prepareStatement(query);
    sqlStatement.setInt(1, lectureID);
    sqlStatement.setInt(2, lectureID);
    sqlStatement.setInt(3, lectureID);
    ResultSet resultSet = sqlStatement.executeQuery();

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

【问题讨论】:

  • 为什么要运行 2 个查询?
  • @MinhKieu 因为,我不能在单个查询中做到这一点,我尝试但找不到解决方案,然后我用两个查询解决了
  • 为什么不运行存储 java 的第一个查询并将其传递给第二个查询,就像对 .setInt(4, countOfLectureGrade) 所做的那样?我怀疑 JDBC 驱动程序不知道您要返回哪个结果集?

标签: java mysql sql jdbc


【解决方案1】:

这是不可能的,您必须将查询分开,以获得可以使用过程或函数的最佳解决方案。

  1. 程序应该采取lectureID
  2. 返回你的结果,在你的情况下它应该是多个值,你可以阅读How to retrieve multiple rows from stored procedure in mysql?了解如何使用过程返回多个值

【讨论】:

    【解决方案2】:

    我不熟悉 JDBC,但快速搜索建议您应该使用 execute 而不是 executeQuery

    execute:如果查询返回的第一个对象是一个 结果集对象。如果查询可以返回一个或 更多 ResultSet 对象。检索从返回的 ResultSet 对象 通过重复调用 Statement.getResultSet 进行查询。

    https://docs.oracle.com/javase/tutorial/jdbc/basics/processingsqlstatements.html#executing_queries

    【讨论】:

      【解决方案3】:

      看看下面的documentation,它解释了使用execute()而不是executeQuery(),然后在你得到的结果集上触发getResultSet()

      整个方法是将您的查询更改为存储过程并通过CallableStatement 调用它。

      文档建议:

      虽然 CallableStatement 支持调用任何 Statement 执行方法(executeUpdate()、executeQuery() 或 execute()),但最灵活的调用方法是 execute(),因为您不需要提前知道是否存储过程返回结果集。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-30
        • 1970-01-01
        • 1970-01-01
        • 2020-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多