1. Implicit markör
Det är nästan alltid bättre att använda den implicita markören för en FOR
loop än att tillgripa en något långsammare och svårhanterlig explicit markör. Jag har skrivit tusentals plpgsql-funktioner och bara en hand full av gånger explicita markörer var vettigt.
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;
Bortsett från:det finns inget i funktionen som skulle behöva volatilitet VOLATILE
. Använd STABLE
.
2. Uppsättningsbaserat tillvägagångssätt
Det är nästan alltid bättre att använda en uppsättningsbaserad metod om möjligt . Använd RETURN QUERY
för att returnera som set från en fråga direkt.
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 det enkla fallet (förmodligen en förenkling), kan du också använda en enkel SQL-funktion eller till och med bara frågan:
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;