PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie verwendet man „RETURN NEXT“ in PL/pgSQL richtig?

Das angegebene Beispiel kann vollständig durch RETURN QUERY ersetzt werden :

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

das wird viel sein schneller.

Generell sollten Sie Iterationen möglichst vermeiden und stattdessen mengenorientierte Operationen bevorzugen.

Wo return next über eine Schleife unvermeidlich ist (was sehr selten vorkommt und meistens darauf beschränkt ist, wenn Sie eine Ausnahmebehandlung benötigen), müssen Sie OUT setzen Parameterwerte oder Tabellenparameter, dann return next ohne Argumente.

In diesem Fall ist Ihr Problem die Zeile SELECT yr.y, 'hi'; was nichts bringt. Sie gehen davon aus, dass das implizite Ziel eines SELECT ist der out-Parameter, aber das ist nicht der Fall. Sie müssten die out-Parameter als Schleifenvariablen verwenden, wie es @peterm getan hat, Zuweisungen verwenden oder SELECT INTO verwenden :

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;