आप वास्तव में लौटने . नहीं हैं परिणाम। आप RETURN QUERY EXECUTE
. का प्रयोग करेंगे उस के लिए। उदाहरण:
लेकिन शुरू करने के लिए आपको यहां गतिशील SQL की आवश्यकता नहीं है ...
CREATE OR REPLACE FUNCTION get_items_by_tag(VARIADIC tags text[])
RETURNS TABLE (id int, title text, tag text[]) AS
$func$
BEGIN
IF array_length(tags, 1) > 0 THEN
-- NO need for EXECUTE
RETURN QUERY
SELECT d.id, d.title, array_agg(t.title)
FROM items d
JOIN item_tags dt ON dt.item_id = d.id
JOIN tags t ON t.id = dt.tag_id
AND t.title = ANY ($1) -- use ANY construct
GROUP BY d.id; -- PK covers whole table
-- array_to_string(tags, ',') -- no need to convert array with ANY
-- ELSE ...
END IF;
END
$func$ LANGUAGE plpgsql;
वास्तविक सरणी के साथ कॉल करें:
SELECT * FROM get_items_by_tag(VARIADIC '{tag1,tag2}'::text[]);
या आइटम की सूची ("शब्दकोश") के साथ कॉल करें:
SELECT * FROM get_items_by_tag('tag1', 'tag2');
प्रमुख बिंदु
-
RETURN QUERY
का उपयोग करें वास्तव में परिणामी पंक्तियों को वापस करने के लिए। -
जब तक आपको इसकी आवश्यकता न हो, गतिशील SQL का उपयोग न करें। (नहीं
EXECUTE
यहाँ।) -
एक
ANY
का प्रयोग करेंIN
. के बजाय निर्माण करें . क्यों? -
मेरा सुझाव है कि एक
VARIADIC
सुविधा के लिए समारोह। इस तरह आप या तो एक सरणी या अपने चयन पर वस्तुओं की एक सूची पास कर सकते हैं। देखें: -
यदि संभव हो तो Postgres में मिश्रित-केस पहचानकर्ताओं से बचें।
सुनिश्चित नहीं हैं कि आपके पास IF array_length(tags, 1) > 0 THEN
. क्यों है , लेकिन संभवत:IF tags IS NOT NULL THEN
. से बदला जा सकता है या नहीं IF
बिल्कुल भी और IF NOT FOUND THEN
. का पालन करें . अधिक: