resueltos - tipos de consultas en sql




Tipo de retorno de la función SQL: TABLA vs registros SETOF (2)

Cuando se devuelve el SET OF record las columnas de salida no se escriben ni se nombran. Por lo tanto, esta forma 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 definición de columna para las funciones que devuelven "registro"

Sin embargo, el llamador de 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 resultados en:

 id |      name      
----+----------------
  1 | Dance Party
  2 | Happy Hour
 ...

Por esta razón, el SET OF record se considera menos práctico. Se debe utilizar solo cuando los tipos de columna de los resultados no se conocen de antemano.

¿Cuál es la diferencia entre una función que devuelve los SETOF records TABLE vs SETOF records , todo lo demás es igual?

CREATE FUNCTION events_by_type_1(text) RETURNS TABLE(id bigint, name text) AS $$
    SELECT id, name FROM events WHERE type = $1;
$$ LANGUAGE SQL STABLE;

CREATE FUNCTION events_by_type_2(text) RETURNS SETOF record AS $$
    SELECT id, name FROM events WHERE type = $1;
$$ LANGUAGE SQL STABLE;

Estas funciones parecen devolver los mismos resultados. Ver este SQLFiddle .


Esta respuesta es solo para recordar el contexto alternativo donde TABLE y SETOF son equivalentes .

Como @a_horse_with_no_name señaló, no es un "registro desconocido" , es uno definido.

En este ejemplo, la table tipos y el 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.

La CONFIGURACIÓN DE DEVOLUCIONES tiene la ventaja del tipo de reutilización (ver footype ), que es imposible con la TABLA DE DEVOLUCIONES .





sql-types