Thread: SETOF come ritorno delle funzioni

SETOF come ritorno delle funzioni

From
Piviul
Date:
Ciao a tutti, avrei bisogno di creare una funzione che restituisca un
insieme di record. Ho visto che è possibile fare restituire ad una
funzione una tabella di cui si definiscono i campi all'interno della
funzione stessa

CREATE FUNCTION foo() RETURNS TABLE(id INT, foo TEXT)

Poi nel corpo provo a costruirmi il record da restituire con RETURN NEXT
ma mi da un errore: RETURN NEXT non può avere un parametro in una
funzione con parametri OUT a o vicino "r" dove "r" è la variabile di
tipo record che vorrei accodare all'output.

Vorrei in altre parole fare una funzione tipo:

CREATE OR REPLACE FUNCTION magazzino.foo()
RETURNS TABLE(id INT, nome TEXT) AS
$pippo$
DECLARE
   r RECORD;
BEGIN
    FOR r in
       SELECT id::int, nome::text
       FROM foo
    LOOP
        RETURN NEXT r;
    END LOOP;
    RETURN;
END;
$pippo$ LANGUAGE plpgsql;

Cosa sbaglio?

Piviul


Re: SETOF come ritorno delle funzioni

From
Pavel Stehule
Date:
Hello

sorry, a used language in this mailing list is English language

2012/11/30 Piviul <piviul@riminilug.it>:
> Ciao a tutti, avrei bisogno di creare una funzione che restituisca un
> insieme di record. Ho visto che è possibile fare restituire ad una
> funzione una tabella di cui si definiscono i campi all'interno della
> funzione stessa
>
> CREATE FUNCTION foo() RETURNS TABLE(id INT, foo TEXT)
>
> Poi nel corpo provo a costruirmi il record da restituire con RETURN NEXT
> ma mi da un errore: RETURN NEXT non può avere un parametro in una
> funzione con parametri OUT a o vicino "r" dove "r" è la variabile di
> tipo record che vorrei accodare all'output.
>
> Vorrei in altre parole fare una funzione tipo:
>
> CREATE OR REPLACE FUNCTION magazzino.foo()
> RETURNS TABLE(id INT, nome TEXT) AS
> $pippo$
> DECLARE
>    r RECORD;
> BEGIN
>     FOR r in
>        SELECT id::int, nome::text
>        FROM foo
>     LOOP
>         RETURN NEXT r;
>     END LOOP;
>     RETURN;
> END;
> $pippo$ LANGUAGE plpgsql;
>

there should be identifier collision - you cannot simply mix plpgsql
variables and sql identifiers - so you have to use qualified
identifiers - schema.name

CREATE OR REPLACE FUNCTION magazzino.foo()
RETURNS TABLE(id INT, nome TEXT) AS
$pippo$
BEGIN
    FOR  id, nome in
       SELECT foo.id::int, foo.nome::text
       FROM foo
    LOOP
        RETURN NEXT;
    END LOOP;
    RETURN;
END;
$pippo$ LANGUAGE plpgsql;

Regards

Pavel Stehule

> Cosa sbaglio?
>
> Piviul
>
>
> --
> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general


Re: SETOF come ritorno delle funzioni

From
Vincent Veyron
Date:
Le lundi 03 décembre 2012 à 08:29 +0100, Pavel Stehule a écrit :
> Hello
>
> sorry, a used language in this mailing list is English language
>

You're right, of course, but I'll try and answer since I read a bit of
Italian.

Piviul, si deve scrivere in inglese qua, per ottenere delle risposte.


> 2012/11/30 Piviul <piviul@riminilug.it>:
> > Ciao a tutti, avrei bisogno di creare una funzione che restituisca un
> > insieme di record. Ho visto che è possibile fare restituire ad una
> > funzione una tabella di cui si definiscono i campi all'interno della
> > funzione stessa
> >
> > CREATE FUNCTION foo() RETURNS TABLE(id INT, foo TEXT)
> >
> > Poi nel corpo provo a costruirmi il record da restituire con RETURN NEXT
> > ma mi da un errore: RETURN NEXT non può avere un parametro in una
> > funzione con parametri OUT a o vicino "r" dove "r" è la variabile di
> > tipo record che vorrei accodare all'output.
> >

Se ho capito bene, basta usare questo :

CREATE OR REPLACE FUNCTION foo(text) RETURNS TABLE(id INT, nome TEXT, a
text) AS
$pippo$
       SELECT id, nome, $1
       FROM foo;
$pippo$ LANGUAGE sql;

select foo('a');

















> > Vorrei in altre parole fare una funzione tipo:
> >
> > CREATE OR REPLACE FUNCTION magazzino.foo()
> > RETURNS TABLE(id INT, nome TEXT) AS
> > $pippo$
> > DECLARE
> >    r RECORD;
> > BEGIN
> >     FOR r in
> >        SELECT id::int, nome::text
> >        FROM foo
> >     LOOP
> >         RETURN NEXT r;
> >     END LOOP;
> >     RETURN;
> > END;
> > $pippo$ LANGUAGE plpgsql;
> >
>
> there should be identifier collision - you cannot simply mix plpgsql
> variables and sql identifiers - so you have to use qualified
> identifiers - schema.name
>
> CREATE OR REPLACE FUNCTION magazzino.foo()
> RETURNS TABLE(id INT, nome TEXT) AS
> $pippo$
> BEGIN
>     FOR  id, nome in
>        SELECT foo.id::int, foo.nome::text
>        FROM foo
>     LOOP
>         RETURN NEXT;
>     END LOOP;
>     RETURN;
> END;
> $pippo$ LANGUAGE plpgsql;
>
> Regards
>
> Pavel Stehule
>
> > Cosa sbaglio?
> >
> > Piviul
> >
> >
> > --
> > Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
> > To make changes to your subscription:
> > http://www.postgresql.org/mailpref/pgsql-general
>
>

--
Vincent Veyron
http://marica.fr
Logiciel pour département juridique