Re: use cursor in a function
От | Rory Campbell-Lange |
---|---|
Тема | Re: use cursor in a function |
Дата | |
Msg-id | 20030617185828.GA8905@campbell-lange.net обсуждение исходный текст |
Ответ на | Re: use cursor in a function (Joe Conway <mail@joeconway.com>) |
Список | pgsql-novice |
On 17/06/03, Joe Conway (mail@joeconway.com) wrote: > Rory Campbell-Lange wrote: > >In a nutshell: > > > >Is there a way of finding out how many rows (ROW_COUNT) are in a cursor > >select? If one can, is there a way of returning a RECORD containing the > >refcursor and the ROW_COUNT? > > > > You aren't buying anything by using a cursor. AFAICS the only way that a > cursor would be a benefit, would be if it could persist from page to > page. Then you could grab just the needed tuples without requerying. But > I'm not aware of any way to do that. > > So you might as well run a single > "SELECT count(*) ... WHERE your_criteria_here" > to get the overall count once, and then run your LIMIT/OFFSET query > directly for each page. I understand. I was trying to avoid having to replicate a very long, complex query twice. I was hoping to be able to use mycurcal() to return the row count on the cursor (which I hoped would record all the rows in ROW_COUNT), then do a MOVE and then a FETCH to simulate OFFSET and LIMIT. However I get the following: temporary=> select * from mycurcal(); NOTICE: Row Count 1 mycurcal ---------- 1 (1 row) create or replace function mycur(refcursor) returns refcursor AS ' BEGIN open $1 for select * from abc; RETURN $1; END; ' LANGUAGE 'plpgsql'; create or replace function mycurcal() returns integer AS ' DECLARE rc INTEGER; this record; BEGIN select mycur(''cur'') into this; GET DIAGNOSTICS rc = ROW_COUNT; RAISE NOTICE '' Row Count % '', rc; --fetch all in cur; RETURN 1; END; ' LANGUAGE 'plpgsql'; -- Rory Campbell-Lange <rory@campbell-lange.net> <www.campbell-lange.net>
В списке pgsql-novice по дате отправления: