Reputation: 238
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
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
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
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
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
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