Me pregunto si hay una manera de declarar una variable de tabla de tipos en PL / pgSQL para contener los resultados de la consulta. Por ejemplo, ¿cómo puedo expresar algo como:
q1 = select * from foo;
q2 = select * from bar;
for t1 in q1:
for t2 in q2:
-- do something with t1 and t2
Miré en la próxima construcción de retorno, pero parece que solo puede manejar valores de retorno.
Respuestas:
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
.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>
, regresarSETOF 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.
fuente
CREATE FUNCTION footest() RETURNS SETOF foo LANGUAGE PLPGSQL AS $$...