1. Implicit markør
Det er næsten altid bedre at bruge den implicitte markør af en FOR
sløjfe end at ty til en noget langsommere og uhåndterlig eksplicit markør. Jeg har skrevet tusindvis af plpgsql-funktioner, og kun en hånd fuld af gange med eksplicitte markører gav mening.
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;
Bortset fra:der er intet i funktionen, der kræver volatilitet VOLATILE
. Brug STABLE
.
2. Set-baseret tilgang
Det er næsten altid bedre at bruge en sæt-baseret tilgang hvis det er muligt . Brug RETURN QUERY
for at returnere som sæt fra en forespørgsel direkte.
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
Til det simple tilfælde (sandsynligvis en forenkling), kan du også bruge en simpel SQL-funktion eller endda bare forespørgslen:
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;