Saltar al contenido

Tipo de retorno de función SQL: registros TABLE vs SETOF

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *