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;