PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come usare correttamente `RETURN NEXT`in PL/pgSQL?

L'esempio fornito può essere completamente sostituito con RETURN QUERY :

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

che sarà un lotto più veloce.

In generale, dovresti evitare l'iterazione ove possibile e preferire invece le operazioni orientate ai set.

Dove return next su un ciclo è inevitabile (cosa molto rara e per lo più confinata a quando è necessaria la gestione delle eccezioni) devi impostare OUT valori dei parametri o parametri della tabella, quindi return next senza argomenti.

In questo caso il tuo problema è la riga SELECT yr.y, 'hi'; che non fa niente. Stai assumendo che la destinazione implicita di un SELECT è il parametro out, ma non è così. Dovresti usare i parametri out come variabili di ciclo come ha fatto @peterm, usare le assegnazioni o usare 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;