Re: Problem with executeBatch and "A result was returned when none was expected" - Mailing list pgsql-jdbc
| From | Dave Cramer |
|---|---|
| Subject | Re: Problem with executeBatch and "A result was returned when none was expected" |
| Date | |
| Msg-id | AANLkTinKjMQifBcTKsyYs59LMuUKxJePS4-+ia+-Hkm9@mail.gmail.com Whole thread |
| In response to | Problem with executeBatch and "A result was returned when none was expected" (Sean Bowman <pico303@gmail.com>) |
| Responses |
Re: Problem with executeBatch and "A result was returned when
none was expected"
|
| List | pgsql-jdbc |
Sean,
Apparently the only database it works for is mysql. It certainly works
for single prepared statements.
Dave
On Wed, Mar 16, 2011 at 5:14 AM, Sean Bowman <pico303@gmail.com> wrote:
> I've been trying to batch create a bunch of records using stored procedures
> and the executeBatch() method (so I can get back the generated PKID's) with
> no luck. I've tried PostgreSQL 8.4.2 with the 8.4-701.jar and 8.4-702.jar
> on OS X, PostgreSQL 9.0.3 with the latest 9.0 JAR on both OS X and Ubuntu
> Linux, all under JDK 1.6, and all with the same results. When I try to call
> executeBatch, I get a BatchUpdateException with the message: "A result was
> returned when none was expected".
> Here's my simple example that I whittled down from my larger application:
> import java.sql.*;
> public class Check {
> public static void main(String[] args) throws Exception {
> try {
> Class.forName("org.postgresql.Driver");
> Connection con = DriverManager.getConnection(
> "jdbc:postgresql://localhost/mydb", "postgres", null);
> con.setAutoCommit(false);
> PreparedStatement stmt = con.prepareStatement(
> "INSERT INTO users (email,password,login) VALUES
> (?,?,?)",
> Statement.RETURN_GENERATED_KEYS);
> stmt.setObject(1, "myemail@gmail.com");
> stmt.setObject(2, "test");
> stmt.setObject(3, "sbowman");
> stmt.addBatch();
> stmt.executeBatch();
> System.out.println("Got " + stmt.getGeneratedKeys());
> } catch (ClassNotFoundException e) {
> e.printStackTrace();
> } catch (SQLException e) {
> System.out.println(e.getMessage());
> System.out.println(e.getNextException().getMessage());
> }
> }
> }
> This always, in all settings described above, returns (raised from the
> stmt.executeBatch() line):
> Batch entry 0 INSERT INTO users (email,password,login) VALUES
> ('myemail@gmail.com','test','sbowman') RETURNING * was aborted. Call
> getNextException to see the cause.
> A result was returned when none was expected.
> Here's the stacktrace:
> java.sql.BatchUpdateException: Batch entry 0 INSERT INTO users
> (email,password,login) VALUES ('myemail@gmail.com','test','sbowman')
> RETURNING * was aborted. Call getNextException to see the cause.
> at
> org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2586)
> at
> org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleResultRows(AbstractJdbc2Statement.java:2550)
> at
> org.postgresql.core.v3.QueryExecutorImpl$1.handleResultRows(QueryExecutorImpl.java:437)
> at
> org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1747)
> at
> org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407)
> at
> org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2725)
> at Check.main(Check.java:21)
> I think my code is correct. If I modify the above code to use a MySQL
> database instead of a PostgreSQL database, everything works fine and I do
> get the PKID's generated by the database back.
> I was under the impression that getGeneratedKeys() was now working, since
> 8.4-701.jar, but for the life of me I can't figure out how.
> If I skip using the batch methods and insert user records one at a time,
> calling "stmt.execute()", then the getGeneratedKeys() call returns a
> ResultSet with the generated ID in it. So execute() works, but
> executeBatch() doesn't.
> Any suggestions or pointing out my code flaws would be most appreciated. Or
> does executeBatch just not work? I've been battling this issue most of the
> day and I'm just about at my wits' end. Should I just give up and switch to
> calling execute() one at a time? Seems far less efficient, but at least it
> seems to work.
> Thanks,
> Sean
>
pgsql-jdbc by date: