Thread: SETOF come ritorno delle funzioni
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
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
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