जवाब
DO
एक स्ट्रिंग शाब्दिक . की अपेक्षा करता है plpgsql कोड के साथ। psql में स्ट्रिंग्स के अंदर प्रतीकों को प्रतिस्थापित नहीं किया जाता है।
आप पूरी स्ट्रिंग को एक psql वैरिएबल में जोड़ सकते हैं और फिर इसे निष्पादित करें।
- psql चरों को कैसे संयोजित करें?
सुंदर बहु-पंक्ति प्रारूप संभव नहीं है, क्योंकि (प्रति दस्तावेज़):
<ब्लॉकक्वॉट>लेकिन किसी भी स्थिति में, मेटा-कमांड के तर्क पंक्ति के अंत से आगे जारी नहीं रह सकते हैं।
सरल उदाहरण:
test=# \set value foo
test=# \set do 'BEGIN\n RAISE NOTICE ''v: %'', ' :'value' ';\nEND'
test=# DO :'do';
NOTICE: v: foo
लाइन ब्रेक को \n
. से बदलें (या यदि आप सुंदर प्रारूप की परवाह नहीं करते हैं तो उन्हें हटा दें)। इस अनुकूलित कोड के आधार पर:
DO
'
DECLARE
_val text;
_vals text[] := string_to_array(>>values<<, '','');
BEGIN
FOREACH _val IN ARRAY _vals
LOOP
RAISE NOTICE ''v: %'', _val;
END LOOP;
END
'
यह इस तरह दिखता है:
test=# \set do 'DECLARE\n _val text;\n _vals text[] := string_to_array(' :'values' ', '','');\nBEGIN\n FOREACH _val IN ARRAY _vals\n LOOP\n RAISE NOTICE ''v: %'', _val;\n END LOOP;\nEND'
test=# DO :'do';
NOTICE: v: foo
NOTICE: v: bar
NOTICE: v: baz
DO
मैंने बोल्ड added जोड़ा पता लगाना आसान बनाने के लिए चर पर जोर दें।
सर्वर सत्र चर का उपयोग करके @Pavel (ab) द्वारा संबंधित उत्तर:
- पीएल/पीजीएसक्यूएल से सत्र चर (\set var='value') का जिक्र करते हुए
वैकल्पिक समाधान
तैयार स्टेटमेंट
आपका वर्तमान समाधान उतना बुरा नहीं लगता। मैं सरल करूँगा:
PREPARE get_values AS SELECT * FROM regexp_split_to_table(:'values', ',');
DO
$do$
DECLARE
_val text;
BEGIN
FOR _val IN EXECUTE
'EXECUTE get_values'
LOOP
RAISE NOTICE 'v: %', _val;
END LOOP;
END
$do$;
अस्थायी तालिका
अस्थायी तालिका के साथ समान समाधान:
CREATE TEMP TABLE tmp AS SELECT * FROM regexp_split_to_table(:'values', ',') v;
DO
$do$
DECLARE
_val text;
BEGIN
FOR _val IN
TABLE tmp
LOOP
RAISE NOTICE 'v: %', _val;
END LOOP;
END
$do$;