1. Con trỏ ngầm
Hầu như luôn tốt hơn nếu sử dụng con trỏ ngầm của FOR
vòng lặp hơn là sử dụng một con trỏ rõ ràng hơi chậm và khó sử dụng. Tôi đã viết hàng nghìn hàm plpgsql và chỉ có một số lần con trỏ rõ ràng có ý nghĩa.
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;
Ngoài ra:không có gì trong hàm cần sự biến động VOLATILE
. Sử dụng STABLE
.
2. Phương pháp dựa trên tập hợp
Hầu như luôn tốt hơn nếu sử dụng phương pháp tiếp cận dựa trên tập hợp nếu có thể . Sử dụng RETURN QUERY
để trả về như đã đặt từ một truy vấn trực tiếp.
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. Hàm SQL
Đối với trường hợp đơn giản (có thể là đơn giản hóa), bạn cũng có thể sử dụng một hàm SQL đơn giản hoặc thậm chí chỉ truy vấn:
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;