Hi Oliver,

Thanks for pointing me to this discussion.  From what I can tell, work must have been done on the postgres backend to improve support for cursors.  I have been using cursors with fairly complex queries (joins and nested subqueries and order bys) without any problems. 

I went ahead and patched the JDBC jar from the CVS head on gborg.  This patch should enable scrollable cursor support, and provide absolute() w/o loading all results into the JDBC buffer.  Unfortunately, the patch involves changing some core aspects of the driver.  I have not reviewed the existing code thoroughly, so I could have introduced problems.  I have also not tested extensively.  However, the patch works for me, and I could use the patched driver with existing applications.  Is there a test suite for the driver?  At this point I hope to get some feedback.

Here is a summary of the patch:
    AbstractJdbc1ResultSet
        - added "buffer_row" and "cursor_row" to track cursor and buffer position.  remove "current_row", and use these instead.
        - use a new variable "needsRefresh" to control reload state explicitly
        - convert next() method to load on demand instead of pre-load.  the former method does not work with cursor positioning, or would require a hack to load data twice, and support multiple modes of loading.

    Abstract1Jdbc1Statement
        - to prevent pre-load, I made the while loop over reallyResultSet() occur only if cursors are disabled.  I don't think this is needed in this context for cursors, but I'm not certain.
        - added DECLARE SCROLL CURSOR to handle scrollable case.

    AbstractJdbc2ResultSet
        - use a new variable "internalIndex" in AbstractJdbc2ResultSet to track absolute position, to avoid overlapping repositioning.
        - implement absolute() as FETCH ABSOLUTE.  relative() uses this code, so it should be supported as well.

thanks,
Indra

Oliver Jowett wrote:
Indra Heckenbach wrote:
Thanks for the info.  So the implementation is functional, but does so by preventing cursors.  Unfortunately, I am dealing with a large result set, so I need to use cursors.  I started modifying the jdbc driver.  Any other suggestions?

There was a discussion about implementing this a couple of months ago that might be useful to you, starting at: http://archives.postgresql.org/pgsql-jdbc/2004-01/msg00288.php

-O