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
का उपयोग करें ।
सेट-आधारित दृष्टिकोण का उपयोग करना लगभग हमेशा बेहतर होता है यदि संभव हो तो . 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;
<एच4>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;