Solución:
Al regresar SETOF record
las columnas de salida no se escriben ni se nombran. Por lo tanto, este formulario no se puede usar directamente en una cláusula FROM como si fuera una subconsulta o una tabla.
Es decir, al emitir:
SELECT * from events_by_type_2('social');
obtenemos este error:
ERROR: se requiere una lista de definiciones de columna para las funciones que devuelven “registro”
Sin embargo, el llamador SQL puede “convertirlo” en los tipos de columna correctos. Este formulario funciona:
SELECT * from events_by_type_2('social') as (id bigint, name text);
y resulta en:
id | name ----+---------------- 1 | Dance Party 2 | Happy Hour ...
Por esta razón SETOF record
se considera menos práctico. Debe usarse solo cuando los tipos de columna de los resultados no se conocen de antemano.
Esta respuesta es solo para recordar la alternativa contexto donde MESA y SETOF son equivalentes.
Como señaló @a_horse_with_no_name, no es un DEVOLUCIONES CONFIGURADAS “registro desconocido”, es uno definido.
En este ejemplo, los tipos table
y setof
son equivalentes,
CREATE TYPE footype AS (score int, term text);
CREATE FUNCTION foo() RETURNS SETOF footype AS $$
SELECT * FROM ( VALUES (1,'hello!'), (2,'Bye') ) t;
$$ language SQL immutable;
CREATE FUNCTION foo_tab() RETURNS TABLE (score int, term text) AS $$
SELECT * FROM ( VALUES (1,'hello!'), (2,'Bye') ) t;
$$ language SQL immutable;
SELECT * FROM foo(); -- works fine!
SELECT * FROM foo_tab(); -- works fine and is equivalent.
los DEVOLUCIONES AJUSTADAS tener el ventaja del tipo de reutilización (ver footype), eso es imposible con TABLA DE DEVOLUCIONES.