14

I have come across a strange behavior while executing a SELECT query using Statement#executeUpdate() by mistake. While the Javadoc clearly states that executeUpdate() throws SQLException if the given SQL statement produces a ResultSet object. But when I'm executing SELECT * from TABLE_NAME, I don't get any exception. Instead I'm getting an return value which is same as the no. of rows selected, if no. is less than or equal to 10. If the no. is more than 10, the return value is always 10.

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);
}

I am using Oracle 10g.

Am I missing something here or is it up to the drivers to define their own behavior?

1
  • Be aware that the javadoc specifies the expected behavior, not necessarily the actual behavior as implemented in the specific driver! Commented Dec 19, 2012 at 12:35

5 Answers 5

4

This behaviour is definetely contradicts Statement.executeUpdate API. What's interesting, java.sql.Driver.jdbcCompliant API says "A driver may only report true here if it passes the JDBC compliance tests". I tested oracle.jdbc.OracleDriver.jdbcCompliant - it returns true. I also tested com.mysql.jdbc.Driver.jdbcCompliant - it returns false. But in the same situation as you describe it throws

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

It seems that JDBC drivers are unpredictable.

Sign up to request clarification or add additional context in comments.

2 Comments

What specifications state and what vendors deliver are still 2 different things it seems.
A comment in this related question explains the strange behavior for Oracle drivers. stackoverflow.com/questions/4756094/…
3

According to the specifications Statement.executeUpdate() method returns the row count for SQL Data Manipulation Language (DML).

UPD: I attempted to make an assumption about the returned result (which is always <=10). It seems, that the oracle statement's implementation returns here a number of a such called premature batch count (according to the decompiled sources OraclePreparedStatement class). This is somehow linked to the update statements. May be this value equals 10 by default.

UPD-2: According to this: Performance Extensions: The premature batch flush count is summed to the return value of the next executeUpdate() or sendBatch() method.

Comments

2

The query you are using doesn't produce a ResultSet but affects Rows obviously. That's why you don't get an SQLException but a count of the no of rows affected. The mystery is why it doesn't go beyond 10. May it is Oracle JDBC Driver Implementation Specific.

Comments

1

Your sql query is to retrieve all rows from table_name. So, you can use execute() method instead of executeUpdate() method. Because later method generally use when your task is related database manipulating language like update query.

1 Comment

Doesnt' answer the question.
1

use

int count = stmt.executeQuery("SELECT * from TABLE_NAME");

instead of

int count = stmt.executeUpdate("SELECT * from TABLE_NAME");

for getting total no. of rows.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.