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

Peripheral Links

Header And Logo

PostgreSQL
| The world's most advanced open source database.

Site Navigation

Search for
  Advanced Search

Re: Synthesize support for Statement.getGeneratedKeys()?




On 23-Jan-07, at 2:00 AM, Ken Johanson wrote:

My real question is, what about the case where multiple VALUES are inserted; if I have 3 values should I call the sequence 3 times? What is the most efficient was to do that? (Can I do it in a single query?)

I don't think you should use "currval" or "nextval" at all. A general solution in the JDBC driver should even work in the case of triggers that interfere with the value of a sequence. Or which might change the value actually inserted into the table. Just think of an insert trigger that uses a sequence for a second time.

There is only one way to reliably get the database generated values: the RETURNING clause.

So my basic suggestion was to rewrite a query written as:
"INSERT INTO tab VALUES (...)"
into
"INSERT INTO tab VALUES (...) RETURNING x"

With x being either (a) what the user specified using the Java API (i.e. any column names) or (b) the primary key column(s) (or other columns having a "DEFAULT currval(...)"). The second case (b) I would leave for later, since it requires parsing the query and finding the table which will be inserted into. And you would have to use database meta data to find the columns to return.



I think that, given everyone's input (including Vit's, thanks) and mention of possible variation on query, possible need to parse for table/column names, and/or need to call database metadata / or result set metadata (to get keys?) (which require another trip to the server?)... this might be out of my league. Well, even if I did get it working, it likely would not work in every case (triggers etc), and would eventually be replaced when V4 protocol comes around.

Unless one of the PG folks can prescribe, in exact terms, the very best way to execute this (after which I would build out the actual patch)... then I may have to bow out of this (it's complex / error prone enough to frighten lil'ol me, and time is a bit short on my end too I'm afraid).

If we can implement the one which does specify the keys that would be useful. Statement.getGeneratedKeys( columns )

Perhaps it's better for everyone if we lobby to have the backend/ protocol to add this natively (as you all have suggested). So..

Does anyone know if the actual server core natively has the ability to build created-keys resultsets (without having to modify the query / RETURNS), or is this truly a protocl bottleneck?...

I don't know for absolute certainty but I highly suspect that it does, since it can return the columns returned via insert returning

Dave
Thanks,
Ken







Home | Main Index | Thread Index

Privacy Policy | PostgreSQL Archives hosted by Command Prompt, Inc. | Designed by tinysofa
Copyright © 1996 – 2008 PostgreSQL Global Development Group