Re: cursors and function question

From: armand pirvu <armand(dot)pirvu(at)gmail(dot)com>
To: Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com>
Cc: "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: Re: cursors and function question
Date: 2018-02-13 19:17:14
Message-ID: CFD427B2-8A62-4F37-821F-AAF67D7E09FC@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general


> On Feb 13, 2018, at 12:54 PM, Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com> wrote:
>
> On 02/13/2018 10:22 AM, armand pirvu wrote:
>> Hi
>> Is there any elegant way not a two steps way I can output the cursor value at each step?
>> testtbl table has this content
>> col1 | col2 | col3
>> ------------+------------+------
>> E1 | CAT1 | 0
>> E1 | CAT2 | 0
>> E1 | CAT3 | 0
>> E4 | CAT1 | 0
>> E5 | CAT1 | 0
>> E6 | CAT1 | 0
>> E7 | CAT1 | 0
>> This works
>> BEGIN WORK;
>> DECLARE fooc CURSOR FOR SELECT * FROM testtbl;
>> FETCH ALL FROM fooc;
>> CLOSE fooc;
>> COMMIT WORK;
>> col1 | col2 | col3
>> ------------+------------+------
>> E1 | CAT1 | 0
>> E1 | CAT2 | 0
>> E1 | CAT3 | 0
>> E4 | CAT1 | 0
>> E5 | CAT1 | 0
>> E6 | CAT1 | 0
>> E7 | CAT1 | 0
>> But
>> CREATE OR REPLACE FUNCTION foofunc()
>> RETURNS text AS $$
>> DECLARE
>> var2 RECORD;
>> cur CURSOR FOR SELECT * from testtbl;
>> BEGIN
>> OPEN cur;
>> LOOP
>> FETCH cur INTO var2;
>> return var2;
>> END LOOP;
>> CLOSE cur;
>> END; $$
>> LANGUAGE plpgsql;
>
>
> CREATE OR REPLACE FUNCTION public.foofunc()
> RETURNS SETOF testtbl
> LANGUAGE sql
> AS $function$
> SELECT * FROM testtbl;
> $function$
>
>
> test=> select * from foofunc();
> col1 | col2 | col3
> ------+------+------
> E1 | CAT1 | 0
> E1 | CAT2 | 0
> E1 | CAT3 | 0
> E4 | CAT1 | 0
> E5 | CAT1 | 0
> E6 | CAT1 | 0
> E7 | CAT1 | 0
> (7 rows)
>
>
>> select foofunc();
>> foofunc
>> -------------------------------
>> ("E1 ","CAT1 ",0)
>> But I am looking to get
>> foofunc
>> -------------------------------
>> ("E1 ","CAT1 ",0)
>> ("E1 ","CATs ",0)
>> etc
>> Many thanks
>> — Armand
>
>
> --
> Adrian Klaver
> adrian(dot)klaver(at)aklaver(dot)com <mailto:adrian(dot)klaver(at)aklaver(dot)com>

Thanks Adrian

That one I figured it out as well. The idea is that said table has some records which I need to loop and do some processing using cursors similar with

DECLARE
cur CURSOR FOR SELECT *
FROM testtbl FOR UPDATE;
BEGIN
FOR row IN cur LOOP
UPDATE testtbl
SET col3=1
WHERE CURRENT OF cur;
END LOOP;
return cur;
END

For a row update the goal is to return the cursor value be it before/after the update, hence my question and test

I found some code which seems to do what I need but it involves two functions

CREATE or replace FUNCTION reffunc(refcursor) RETURNS refcursor AS $$
BEGIN
OPEN $1 FOR SELECT col FROM test;
RETURN $1;
END;
$$ LANGUAGE plpgsql;

BEGIN;
SELECT reffunc('funccursor');
FETCH ALL IN funccursor;
COMMIT;

And this is what beats me , aka can I put all in one / how ?

Thanks
Armand

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Adrian Klaver 2018-02-13 19:22:44 Re: cursors and function question
Previous Message Adrian Klaver 2018-02-13 19:13:58 Re: pglogical in postgres 9.6