1. Implicitní kurzor
Téměř vždy je lepší použít implicitní kurzor FOR
smyčka než se uchýlit k poněkud pomalejšímu a nemotornému explicitnímu kurzoru. Napsal jsem tisíce funkcí plpgsql a jen ruka plná krát explicitních kurzorů dávala smysl.
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;
Stranou:ve funkci není nic, co by vyžadovalo volatilitu VOLATILE
. Použijte STABLE
.
2. Set-based přístup
Téměř vždy je lepší použít přístup založený na množinách pokud je to možné . Použijte RETURN QUERY
vrátit jako nastavenou přímo z dotazu.
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. Funkce SQL
Pro jednoduchý případ (pravděpodobně zjednodušení) můžete také použít jednoduchou funkci SQL nebo dokonce pouze dotaz:
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;