También existe la opción de utilizar RETURNS TABLE(...)
(como se describe en la Manual de PostgreSQL
), que personalmente prefiero:
CREATE OR REPLACE FUNCTION get_countries()
RETURNS TABLE(
country_code text,
country_name text
)
AS $$
SELECT country_code, country_name FROM country_codes
$$ LANGUAGE sql;
Esto es efectivamente lo mismo que usar SETOF tablename
, pero declara la estructura de la tabla en línea en lugar de hacer referencia a un objeto existente, por lo que las uniones y demás seguirán funcionando.