Thread: MOVE in SQL vs PLPGSQL

MOVE in SQL vs PLPGSQL

From
andrew@pillette.com
Date:
I can't find a good way to skip over a large number of records in PLPGSQL (I want to fast-forward and I don't need the
I/Oof reading and throwing away hundreds of records.) In SQL, I could just use MOVE. That doesn't appear to be
supportedin PLPGSQL?! Help?
 


Re: MOVE in SQL vs PLPGSQL

From
Richard Huxton
Date:
andrew@pillette.com wrote:
> I can't find a good way to skip over a large number of records in
> PLPGSQL (I want to fast-forward and I don't need the I/O of reading
> and throwing away hundreds of records.) In SQL, I could just use
> MOVE. That doesn't appear to be supported in PLPGSQL?! Help?

Andrew - your question doesn't seem to make sense - can you give some 
more details? Are you having some problem with cursors in plpgsql?

--  Richard Huxton  Archonet Ltd


Re: MOVE in SQL vs PLPGSQL

From
Richard Huxton
Date:
andrew@pillette.com wrote:
>> Andrew - your question doesn't seem to make sense - can you give
>> some more details? Are you having some problem with cursors in
>> plpgsql?
> 
> 
> Yes. I'd like the effect of the plain SQL MOVE with a PLPGSQL cursor.
> I'm writing a procedure for which SQL is inadequate (I need
> condiitonal branches and looping). However, in PLPGSQL, it appears
> the only way to fast forward on a cursor is a repeated FETCH, which
> is wasteful. PLPGSQL doesn't even allow me to set up a SQL-type
> cursor using EXECUTE--I have to use the refcursor datatype and it
> doesn't appear to support MOVE.
> 
> I could write a procedure client-side in (say) Java without any
> problem using absolute or relative move, but I'd like the procedure
> to run on the server.

Ah, now I see what you're saying. You're quite right in your suspicions, 
"MOVE..." isn't supported for plpgsql cursors. You could probably do 
something with EXECUTE and returning a refcursor from a previous 
function, but that sounds fiddly.

I must admit, on the odd occasion I want to skip a row, I just FETCH it 
and move on. Anyone else?

--   Richard Huxton  Archonet Ltd


Re: MOVE in SQL vs PLPGSQL

From
Tom Lane
Date:
Richard Huxton <dev@archonet.com> writes:
> Ah, now I see what you're saying. You're quite right in your suspicions, 
> "MOVE..." isn't supported for plpgsql cursors. You could probably do 
> something with EXECUTE and returning a refcursor from a previous 
> function, but that sounds fiddly.

> I must admit, on the odd occasion I want to skip a row, I just FETCH it 
> and move on. Anyone else?

There is something on the TODO list about improving plpgsql's cursor
functionality --- there's no reason it shouldn't have MOVE, except that
no one got around to it yet.
        regards, tom lane


Re: MOVE in SQL vs PLPGSQL

From
Greg Stark
Date:
Tom Lane <tgl@sss.pgh.pa.us> writes:

> Richard Huxton <dev@archonet.com> writes:
> > Ah, now I see what you're saying. You're quite right in your suspicions, 
> > "MOVE..." isn't supported for plpgsql cursors. You could probably do 
> > something with EXECUTE and returning a refcursor from a previous 
> > function, but that sounds fiddly.
> 
> > I must admit, on the odd occasion I want to skip a row, I just FETCH it 
> > and move on. Anyone else?
> 
> There is something on the TODO list about improving plpgsql's cursor
> functionality --- there's no reason it shouldn't have MOVE, except that
> no one got around to it yet.

Though the original poster should realize, a MOVE command would be only
marginally more efficient than just fetching those records. It would save the
network overhead and context switches involved in communicating those records,
but there's no way it would let the server avoid reading all those records
from disk.

At least as far as I can see.

-- 
greg