sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo usar `RETURN NEXT` en PL/pgSQL correctamente?

El ejemplo dado puede reemplazarse por completo con RETURN QUERY :

BEGIN
    RETURN QUERY SELECT y_.y, 'hi' FROM generate_series(1,10,1) AS y_(y)
END;

que será mucho más rápido.

En general, debe evitar la iteración siempre que sea posible y, en su lugar, favorecer las operaciones orientadas a conjuntos.

Donde return next sobre un bucle es inevitable (lo cual es muy raro, y en su mayoría se limita a cuando necesita el manejo de excepciones) debe configurar OUT valores de parámetro o parámetros de tabla, luego return next sin argumentos.

En este caso, su problema es la línea SELECT yr.y, 'hi'; que no hace nada. Está asumiendo que el destino implícito de un SELECT son los parámetros de salida, pero ese no es el caso. Tendría que usar los parámetros de salida como variables de bucle como lo hizo @peterm, usar asignaciones o usar SELECT INTO :

FOR yr IN SELECT * FROM generate_series(1,10,1) AS y_(y) 
LOOP
    RAISE NOTICE 'Computing %', yr.y;
    y := yr.y;
    result := 'hi';
    RETURN NEXT;
END LOOP;
RETURN;