गतिशील निष्पादन के लिए एक से अधिक कॉलम नामों को संयोजित स्ट्रिंग के रूप में पास करने के लिए तत्काल परिशोधन की आवश्यकता होती है। मेरा सुझाव है कि एक VARIADIC
कोड>
इसके बजाय फ़ंक्शन पैरामीटर, ठीक से उद्धृत पहचानकर्ताओं के साथ (quote_ident()
. का उपयोग करके) इस मामले में):
CREATE OR REPLACE FUNCTION select_by_txt(z int, x int, y int, VARIADIC cols text[] = NULL, OUT res text)
LANGUAGE plpgsql AS
$func$
BEGIN
EXECUTE format(
$$
SELECT ST_AsMVT(mvtgeom, 'public.select_by_txt')
FROM (
SELECT ST_AsMVTGeom(ST_Transform(t.geom, 3857), bounds.geom) AS geom%s
FROM table1 t
JOIN (SELECT ST_TileEnvelope($1, $2, $3)) AS bounds(geom)
ON ST_Intersects(t.geom, ST_Transform(bounds.geom, 4326))
) mvtgeom
$$, (SELECT ', ' || string_agg(quote_ident (col), ', ') FROM unnest(cols) col)
)
INTO res
USING z, x, y;
END
$func$;
db<>fiddle यहां
प्रारूप विनिर्देशक %I
format()
के लिए एक एकल . से संबंधित है पहचानकर्ता। आपको एकाधिक . के लिए और काम करना होगा पहचानकर्ता, विशेष रूप से 0-n पहचानकर्ताओं की एक चर संख्या के लिए। यह कार्यान्वयन हर एक कॉलम नाम को उद्धृत करता है, और केवल एक ,
. जोड़ता है यदि कोई कॉलम नाम पारित किया गया है। तो यह हर संभव इनपुट के लिए काम करता है , यहां तक कि कोई इनपुट भी नहीं। नोट VARIADIC cols text[] = NULL
डिफ़ॉल्ट मान के रूप में NULL के साथ अंतिम इनपुट पैरामीटर के रूप में:
संबंधित:
इस संदर्भ में कॉलम नाम केस संवेदी होते हैं!
अपने उदाहरण के लिए कॉल करें (महत्वपूर्ण!):
SELECT select_by_txt(10,32,33,'col1', 'col2');
वैकल्पिक सिंटैक्स:
SELECT select_by_txt(10,32,33, VARIADIC '{col1,col2}');
तीसरे कॉलम के नाम और दुर्भावनापूर्ण (हालांकि व्यर्थ) इरादे के साथ अधिक खुलासा कॉल:
SELECT select_by_txt(10,32,33,'col1', 'col2', $$col3'); DROP TABLE table1;--$$);
उस विषम तीसरे स्तंभ नाम और SQL इंजेक्शन के बारे में:
VAIRADIC
के बारे में पैरामीटर:
- plpgsql फ़ंक्शन में इनपुट सरणी के तत्वों से मेल खाने वाली पंक्तियों को लौटाएं
- एकल पैरामीटर में कई मान पास करें
OUT
का उपयोग करना सादगी के लिए पैरामीटर यह पूरी तरह से वैकल्पिक है। देखें:
मैं क्या करूंगा नहीं करो
यदि आप वास्तव में, हर समय 1 या अधिक मान्य कॉलम नामों की उचित रूप से स्वरूपित सूची होने के लिए इनपुट पर वास्तव में भरोसा करते हैं - और आपने यह दावा किया है कि ...
आप कर सकते थे सरल करें:
CREATE OR REPLACE FUNCTION select_by_txt(z int, x int, y int, cols text, OUT res text)
LANGUAGE plpgsql AS
$func$
BEGIN
EXECUTE format(
$$
SELECT ST_AsMVT(mvtgeom, 'public.select_by_txt')
FROM (
SELECT ST_AsMVTGeom(ST_Transform(t.geom, 3857), bounds.geom) AS geom, %s
FROM table1 t
JOIN (SELECT ST_TileEnvelope($1, $2, $3)) AS bounds(geom)
ON ST_Intersects(t.geom, ST_Transform(bounds.geom, 4326))
) mvtgeom
$$, cols
)
INTO res
USING z, x, y;
END
$func$;
(आप इतने आश्वस्त कैसे हो सकते हैं कि इनपुट हमेशा विश्वसनीय रहेगा?)