जैसा कि @dezso ने उल्लेख किया है, आपको इस मामले में गतिशील SQL की आवश्यकता होगी।
डायनामिक SQL के साथ EXECUTE
तो, आप सही रास्ते पर हैं; पीएल/पीजीएसक्यूएल का उपयोग करके एक गतिशील एसक्यूएल स्टेटमेंट बनाना, लेकिन आपको केवल परिष्कृत स्पर्श की आवश्यकता है:
CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table text)
RETURNS integer AS $$
BEGIN
RETURN QUERY EXECUTE format('SELECT id FROM %I AS vertices
ORDER BY vertices.geom <->ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;',_table);
END
$$ LANGUAGE plpgsql;
मेरा मानना है कि इससे आपकी समस्याओं का समाधान हो जाना चाहिए।
नोट:हमने उपरोक्त समाधान और SETOF
. का उपयोग करते हुए एक त्रुटि का पता लगाया है , मैंने नीचे दी गई समस्याओं को ठीक करने का प्रयास किया है।
संपादित करें:
यहां कुछ संपादन, उम्मीद है कि एक समाधान आपकी समस्या को ठीक कर देगा। इसके अलावा, कृपया मेरे पिछले और वर्तमान समाधानों में किसी भी सिंटैक्स त्रुटि के लिए क्षमा करें; मेरे पास अभी उनका परीक्षण करने का समय नहीं है। :(
1) आप बस एक SETOF
returning लौटाने का प्रयास कर सकते हैं पूर्णांक, यह जानते हुए कि निश्चित रूप से आप केवल एक ही लौटाएंगे। इस मामले में आपका वापसी प्रकार एक पूर्णांक वाली एकल, एक-स्तंभ पंक्ति होगी।
CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table text)
RETURNS SETOF integer AS $$
BEGIN
RETURN QUERY EXECUTE format('SELECT id FROM %I AS vertices
ORDER BY vertices.geom <->ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;',_table);
END
$$ LANGUAGE plpgsql;
और फिर कॉल करें:
SELECT * FROM convert_from_lon_lat(...);
2) विशेष रूप से एक पूर्णांक वापस करने के लिए, मुझे लगता है कि आप इसे आजमा सकते हैं:
CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table text)
RETURNS integer AS $$
DECLARE
return_id integer;
BEGIN
EXECUTE format('SELECT id FROM %I AS vertices
ORDER BY vertices.geom <->ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;',_table)
INTO return_id;
RETURN return_id;
END
$$ LANGUAGE plpgsql;