1. Неявен курсор
Почти винаги е по-добре да използвате неявния курсор на FOR
контура отколкото да прибягвате до малко по-бавен и тромав изричен курсор. Написал съм хиляди plpgsql функции и само една ръка, пълна с пъти, че явните курсори са имали някакъв смисъл.
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;
Настрана:във функцията няма нищо, което да се нуждае от волатилност VOLATILE
. Използвайте STABLE
.
2. Подход, базиран на набор
Почти винаги е по-добре да използвате подход, базиран на набори, ако е възможно . Използвайте RETURN QUERY
за да върнете както е зададено от заявка директно.
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 функция
За простия случай (вероятно опростяване) можете също да използвате проста SQL функция или дори само заявката:
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;