Skip site navigation (1) Skip section navigation (2)

Re: getUdateCount() vs. RETURNING clause

From: Oliver Jowett <oliver(at)opencloud(dot)com>
To: Thomas Kellerer <spam_eater(at)gmx(dot)net>
Cc: pgsql-jdbc(at)postgresql(dot)org
Subject: Re: getUdateCount() vs. RETURNING clause
Date: 2009-11-25 12:16:20
Message-ID: 4B0D2014.3060703@opencloud.com (view raw or flat)
Thread:
Lists: pgsql-jdbc
Thomas Kellerer wrote:
> Oliver Jowett, 25.11.2009 12:13:
>>
>> You've done some selective editing there. The javadoc I referred to is
>> this (from the Java 6 javadoc):
>>
>> getResultSet():
>>
>> Retrieves the current result as a ResultSet object. This method should
>> be called only once per result.
> 
> Correct, once per *result* not per statement. If the statement returns
> more than one result, I should be allowed to call it multiple time.

That's right, but you need a call to getMoreResults() to step through
the results between calls, as I suggested in my original response.

> I think the base of my (mis)understanding is that the term "current"
> lead me to believe that the "stack" of results a statement can hold,
> could look like this:
> 
> resultSet
> update count = 3
> update count = 2
> resultSet
> reslutSet

Yes, you can have that. You step through the results by calling
getMoreResults(). At any particular point, the current result is either
a resultset or an update count, but never both.

> So if I create a loop using the condition stated in the Javadocs the
> program flow would be as follows:
> 
> 1) stmt.execute() returns true, so I call getResultSet()
> 2) getMoreResults() returns false, but getUpdateCount() returns 3 ==> go on
> 3) getMoreResults() returns false, but getUpdateCount() returns 2 ==> go on
> 4) getMoreResults() returns true, so getResultSet() returns a result set
> ==> go on
> 5) getMoreResults() returns true, so getResultSet() returns a result set
> ==> go on
> 6) getMoreResults() returns false, getUpdateCount() returns -1 ==>
> everything was processed.

Yes, this is correct. It will look something like this:

boolean hasResultSet = stmt.execute();
int updateCount = stmt.getUpdateCount();
while (hasResultSet || updateCount != -1) {
  if (hasResultSet) {
    ResultSet rs = stmt.getResultSet();
    // This result is a resultset, process rs.
  } else {
    // This result is an update count, process updateCount.
  }

  hasResultSet = stmt.getMoreResults();
  updateCount = stmt.getUpdateCount();
}

-O

In response to

Responses

pgsql-jdbc by date

Next:From: Thomas KellererDate: 2009-11-25 12:30:17
Subject: Re: getUdateCount() vs. RETURNING clause
Previous:From: Thomas KellererDate: 2009-11-25 11:53:17
Subject: Re: getUdateCount() vs. RETURNING clause

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group