I just tested the MOVE -5 in a simple case, and it worked:
test=> begin;
BEGIN
test=> declare xx cursor for select * from pg_class;
DECLARE CURSOR
test=> move 99999999 from xx;
MOVE 157
test=> move -5 from xx;
MOVE 5
test=> fetch 1 from xx;
relname | relnamespace | reltype | relowner | relam | relfilenode |
relpages | reltuples | reltoastrelid | reltoastidxid | relhasindex | relisshared |
relkind | relnatts | relchecks | reltriggers | relukeys | relfkeys | relrefs |
relhasoids | relhaspkey | relhasrules | relhassubclass | relacl
--------------+--------------+---------+----------+-------+-------------+----------+-----------+---------------+---------------+-------------+-------------+---------+----------+-----------+-------------+----------+----------+---------+------------+------------+-------------+----------------+---------------
pg_namespace | 11 | 16595 | 1 | 0 | 16594 |
1 | 5 | 0 | 0 | t | f | r
| 3 | 0 | 0 | 0 | 0 | 0 | t | f
| f | f | {=r/postgres}
(1 row)
What I think you are seeing are that certain cursors can't go backwards.
However, I don't know the details. Anyone?
---------------------------------------------------------------------------
Darko Prenosil wrote:
> On Thursday 06 March 2003 19:08, Bruce Momjian wrote:
> > Jeroen T. Vermeulen wrote:
> > > On Tue, Feb 25, 2003 at 02:04:50PM +0100, Christoph Haller wrote:
> > > > Anyway, you may MOVE until 0 instead of FETCH, or use the COUNT()
> > > > function on the query to learn about the number of rows to be returned.
> > >
> > > Hmm... Wouldn't the reliability of a count() depend on the isolation
> > > level?
> > >
> > > OTOH the problem with MOVE ALL is that not all cursors support backward
> > > scrolling, apparently, and there is no clear documentation (or even
> > > diagnostics!) to determine whether they do.
> >
> > 7.4 does document MOVE ALL as going to the end of the cursor.
>
> Great, Bruce is back !
> I drop the idea to use cursors for recordset buffering, and I'm using temp
> tables. MOVE ALL can solve my first problem, but It can't solve the other
> one: How to know if there is transaction in progress ? The final facts were:
>
> For cursor:
> Fast, and less memory (concerning that only query plan is stored on
> server).
> Against cursor:
> I can't determine if transaction is already in progress, so I do not
> know can I COMMIT on cursor close. (Maybe some other of my recordset
> controls started transactions before)
>
> For table:
> I do not need transaction
> Against table:
> More memory, and slower positioning in the buffer(using LIMIT and
> OFFSET)
>
> OK it is slower, but it works !
>
> I must say one more thing I noticed experimenting with cursors:
> Let's say that we have cursor with 10 rows, if we MOVE 11 rows, cursor
> become unusable, because even if we after that MOVE -5, no row can be
> fetched. I do not think that this is bug, but at last notice should be raised
> with warning that we missed the cursors size. I even find the code that is
> working with cursor, and tried to figure out how to fix this, but it is too
> much for me. Sorry !
>
> Regards !
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 5: Have you checked our extensive FAQ?
>
> http://www.postgresql.org/docs/faqs/FAQ.html
>
--
Bruce Momjian | http://candle.pha.pa.us
[EMAIL PROTECTED] | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly