Kalyan Sarkar
Kalyan Sarkar

Reputation: 238

Behavior of SELECT query using executeUpdate

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?

Upvotes: 14

Views: 6953

Answers (5)

Andremoniy
Andremoniy

Reputation: 34900

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.

Upvotes: 3

abhishek
abhishek

Reputation: 37

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.

Upvotes: 1

Evgeniy Dorofeev
Evgeniy Dorofeev

Reputation: 136022

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.

Upvotes: 4

ved
ved

Reputation: 909

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.

Upvotes: 1

shazin
shazin

Reputation: 21883

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.

Upvotes: 2

Related Questions