使用 executeUpdate 的 SELECT 查询的行为

2022-09-04 21:57:09

我在错误地使用SELECT查询时遇到了一个奇怪的行为。而 Javadoc 明确指出,如果给定的 SQL 语句会生成一个 ResultSet 对象。但是当我执行时,我没有任何例外。相反,我得到的返回值与no相同。所选行的数量(如果不是)。小于或等于 10。如果没有。大于 10,返回值始终为 10。Statement#executeUpdate()executeUpdate() throws SQLExceptionSELECT * from TABLE_NAME

Connection conn;
Statement stmt;
try {
    conn = getConnection();
    stmt = conn.createStatement();
    int count = stmt.executeUpdate("SELECT * from TABLE_NAME");
    log.info("row count: " + count);
} catch (SQLException e) {
    log.error(e);
    // handle exception
} finally {
    DbUtils.closeQuietly(stmt);
    DbUtils.closeQuietly(conn);
}

我使用的是Oracle 10g

我在这里遗漏了什么,还是由驾驶员来定义自己的行为?


答案 1

这种行为肯定与 API 相矛盾。有趣的是,API说“驱动程序只有在通过JDBC一致性测试时才能在此处报告为true”。我测试了 - 它返回真实。我还测试了 - 它返回假。但是在与你描述相同的情况下,它会抛出Statement.executeUpdatejava.sql.Driver.jdbcCompliantoracle.jdbc.OracleDriver.jdbcCompliantcom.mysql.jdbc.Driver.jdbcCompliant

Exception in thread "main" java.sql.SQLException: Can not issue SELECT via executeUpdate().

JDBC 驱动程序似乎是不可预测的。


答案 2

按规格方法返回。Statement.executeUpdate()the row count for SQL Data Manipulation Language (DML)

UPD:我试图对返回的结果做出假设(它总是<=)。看起来,oracle 语句的实现在这里返回了一些这样的调用(根据反编译的 sources 类)。这以某种方式链接到更新语句。默认情况下,此值可能等于此值。10premature batch countOraclePreparedStatement10

UPD-2:根据这一点:性能扩展The premature batch flush count is summed to the return value of the next executeUpdate() or sendBatch() method.


推荐