1. Impliziter Cursor
Es ist fast immer besser, den impliziten Cursor eines FOR
zu verwenden Schleife als auf einen etwas langsameren und unhandlicheren expliziten Cursor zurückzugreifen. Ich habe Tausende von plpgsql-Funktionen geschrieben und nur eine Handvoll Male machten explizite Cursor Sinn.
CREATE OR REPLACE FUNCTION avoidable_states()
RETURNS SETOF varchar AS
$func$
DECLARE
rec record;
BEGIN
FOR rec IN
SELECT *
FROM address ad
JOIN city ct USING (city_id)
LOOP
IF rec.city LIKE '%hi%' THEN
RETURN NEXT rec.city;
END IF;
END LOOP;
END
$func$ LANGUAGE plpgsql STABLE;
Abgesehen davon:Es gibt nichts in der Funktion, das die Volatilität VOLATILE
benötigen würde . Verwenden Sie STABLE
.
2. Set-basierter Ansatz
Es ist fast immer besser, wenn möglich einen satzbasierten Ansatz zu verwenden . Verwenden Sie RETURN QUERY
direkt als Satz aus einer Abfrage zurückzugeben.
CREATE OR REPLACE FUNCTION avoidable_states()
RETURNS SETOF varchar AS
$func$
BEGIN
RETURN QUERY
SELECT ct.city
FROM address ad
JOIN city ct USING (city_id)
WHERE ct.city LIKE '%hi%';
END
$func$ LANGUAGE plpgsql STABLE;
3. SQL-Funktion
Für den einfachen Fall (wahrscheinlich eine Vereinfachung) können Sie auch eine einfache SQL-Funktion verwenden oder sogar nur die Abfrage:
CREATE OR REPLACE FUNCTION avoidable_states()
RETURNS SETOF varchar AS
$func$
SELECT ct.city
FROM address ad
JOIN city ct USING (city_id)
WHERE ct.city LIKE '%hi%';
$func$ LANGUAGE sql STABLE;