PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

डीओ ब्लॉक के अंदर psql मेटा-कमांड द्वारा निर्धारित चर का उपयोग करें

जवाब

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$;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं हेरोकू पर 5 एमबी पोस्टग्रेएसक्यूएल में कितने रिकॉर्ड स्टोर कर सकता हूं?

  2. मैं PostgreSQL ट्रिगर से ईमेल कैसे भेज सकता हूं?

  3. एक ही क्वेरी में एकाधिक array_agg () कॉल

  4. PostgreSQL में ऑर्डिनल नंबर कैसे बनाएं

  5. कैसे Cos () PostgreSQL में काम करता है