En PostgreSQL , cada nombre de tabla sirve como nombre de tipo para el tipo de fila (también conocido como tipo compuesto ) automáticamente; no es un tipo de tabla, no hay "tipos de tabla" o "variables de tabla" en Postgres ( pero hay tablas escritas ).
Entonces puedes declarar una variable de ese tipo PL/pgSQL
.
CREATE FUNCTION foo()
RETURNS void LANGUAGE plpgsql AS
$func$
DECLARE
q1 foo; -- "foo" ...
q2 bar; -- ... and "bar" are existing (visible) table names
BEGIN
FOR q1 IN
SELECT * from foo
LOOP
FOR q2 IN
SELECT * from bar
LOOP
-- do something with q1 and q2
-- since q1 and q2 are well known types, you can access columns
-- with attribute notation. Like: q1.col1
END LOOP;
END LOOP;
END
$func$
Un FOR
bucle funciona con un cursor incorporado. También hay cursores explícitos en plpgsql.
También podría simplemente declarar variables del tipo genérico record
. Puede tomar cualquier tipo de fila en la asignación automáticamente. Pero se aplican reglas especiales. ¡Asegúrese de seguir el enlace y leer el capítulo del manual!
Si bien a menudo es conveniente que la función regrese SETOF <table name>
, regresar SETOF record
no es tan conveniente. El sistema no sabe qué función devuelve de esta manera y debe agregar una lista de definición de columna con cada llamada. Lo cual es un dolor. Detalles sobre las funciones de la tabla en el manual .
Sin embargo, a menudo hay soluciones más eficientes con SQL simple. El bucle es una medida de último recurso, cuando puede hacer cosas en un escaneo en el que necesitaría múltiples escaneos en SQL puro.