1. Kursor implisit
Hampir selalu lebih baik menggunakan kursor implisit dari FOR
lingkaran daripada menggunakan kursor eksplisit yang agak lambat dan berat. Saya telah menulis ribuan fungsi plpgsql dan hanya beberapa kali kursor eksplisit yang masuk akal.
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;
Selain:tidak ada fungsi yang membutuhkan volatilitas VOLATILE
. Gunakan STABLE
.
2. Pendekatan berbasis himpunan
Hampir selalu lebih baik menggunakan pendekatan berbasis himpunan jika memungkinkan . Gunakan RETURN QUERY
untuk kembali sebagai set dari kueri secara langsung.
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. Fungsi SQL
Untuk kasus sederhana (mungkin penyederhanaan), Anda juga dapat menggunakan fungsi SQL sederhana atau bahkan hanya kueri:
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;