आप एक सरल PostgreSQL स्क्रिप्ट में चर का उपयोग कैसे करते हैं?


99

उदाहरण के लिए, MS-SQL में, आप एक क्वेरी विंडो खोल सकते हैं और निम्नलिखित को चला सकते हैं:

DECLARE @List AS VARCHAR(8)

SELECT @List = 'foobar'

SELECT *
FROM   dbo.PubLists
WHERE  Name = @List

यह PostgreSQL में कैसे किया जाता है? क्या यह किया जा सकता है?


जवाबों:


131

पूरा उत्तर आधिकारिक PostgreSQL प्रलेखन में स्थित है ।

आप नए PG9.0 अनाम कोड ब्लॉक सुविधा ( http://www.postgresql.org/docs/9.1/static/sql-do.html ) का उपयोग कर सकते हैं

DO $$
DECLARE v_List TEXT;
BEGIN
  v_List := 'foobar' ;
  SELECT *
  FROM   dbo.PubLists
  WHERE  Name = v_List;
  -- ...
END $$;

इसके अलावा आप अंतिम इन्सर्ट आईडी प्राप्त कर सकते हैं :

DO $$
DECLARE lastid bigint;
BEGIN
  INSERT INTO test (name) VALUES ('Test Name') 
  RETURNING id INTO lastid;

  SELECT * FROM test WHERE id = lastid;
END $$;

7
(और इसके ;बाद END $$, जैसे:END $$;
काजमगनस

3
मेरे सामने काम नहीं करता है, मैं भी plpgsqb भाषा के साथ शुरुआत और अंत के बीच कुछ कार्य करता हूं।
ऐश

49
इस उदाहरण में कोड काम नहीं करता है। ERROR: query has no destination for result data HINT: If you want to discard the results of a SELECT, use PERFORM instead. CONTEXT: PL/pgSQL function inline_code_block line 7 at SQL statement
जैसन

1
PostgreSQL के लिए पूरी तरह से नया होने के नाते इसने मुझे कुछ समय के लिए फेंक दिया, यहाँ कुछ और सुझाव दिए गए हैं: + सुनिश्चित करें कि आपने अपने बयानों को एक अर्धविराम के साथ समाप्त किया है! + क्योंकि कोई चर पहचानकर्ता नहीं है आप अस्पष्ट कॉलम नामों से बचने के लिए एक _ या कुछ इसी तरह का उपयोग करना चाह सकते हैं। + आप इस DECLARE _accountid INT: = 1 का उपयोग करके चर को मान में सेट कर सकते हैं;
कोडर

1
मेरे लिए काम मत करो। गिलहरी का उपयोग करना। त्रुटि: त्रुटि: "डॉलर" के पास या पास के डॉलर-रहित स्ट्रिंग स्ट्रिंग
ओलिवर वाटकिंस

39
DO $$
DECLARE  
   a integer := 10;  
   b integer := 20;  
   c integer;  
BEGIN  
   c := a + b;
    RAISE NOTICE'Value of c: %', c;
END $$;

3
मेरे लिए काम मत करो। गिलहरी का उपयोग करना। त्रुटि: त्रुटि: "डॉलर" के पास या पास के डॉलर-रहित स्ट्रिंग स्ट्रिंग
ओलिवर वाटकिंस

मुझे यह पता लगाने में थोड़ा समय लगा कि चर का उपयोग करने के लिए आपको अन्य चर के साथ इसे उपसर्ग नहीं करना चाहिए: । @ achilles-ram-nakirekanti आप selectइसे स्पष्ट करने के लिए एक बयान में इसका उपयोग करके एक उदाहरण जोड़ सकते हैं ?
पूर्वानुमेय

28

आप उपयोग कर सकते हैं:

\set list '''foobar'''
SELECT * FROM dbo.PubLists WHERE name = :list;

करना होगा


3
त्रुटि: "या" पास में सिंटैक्स त्रुटि मुझे क्या याद आ रही है?
स्कव

14
@scw यह केवल psqlकंसोल से उपलब्ध है । आप इसे अपने ऐप के SQL में नहीं लिख पाएंगे।
ओवेन्समार्टिन

@owensmartin आप psql के माध्यम से पाई जाने वाली किसी भी चीज़ का उपयोग कर पाएंगे .. या कोई स्क्रिप्ट जो psql पढ़ती है ...
इवान कैरोल

4
इस सवाल का जवाब बिल्कुल नहीं है। MS SQL में आप किसी क्वेरी में एक var को डिफाइन कर सकते हैं और वहीं पर, उसी टूल में इसका उपयोग कर सकते हैं। मुझे नहीं लगता कि लोग इस प्रश्न के प्रत्येक संस्करण में एक उत्तर के रूप में प्रस्ताव क्यों रखते हैं।
पत्थर

@ स्टोन जाहिरा तौर पर क्योंकि यह एक विशाल "मिस" है postgresqlऔर यह सबसे कम-सबसे खराब विकल्प है। आम तौर पर मैं काफी प्रसन्न रहा हूँ postgresql: लेकिन यह आश्चर्यजनक रूप से बड़ी असफलता है
जवादबा

10

यहाँ plpgsql में एक चर का उपयोग करने का एक उदाहरण है:

create table test (id int);
insert into test values (1);
insert into test values (2);
insert into test values (3);

create function test_fn() returns int as $$
    declare val int := 2;
    begin
        return (SELECT id FROM test WHERE id = val);
    end;
$$ LANGUAGE plpgsql;

SELECT * FROM test_fn();
 test_fn 
---------
       2

अधिक जानकारी के लिए plpgsql डॉक्स पर एक नज़र डालें ।


4

मुझे कुछ अन्य दस्तावेज़ मिले हैं, जिनका उपयोग वे \setस्क्रिप्टिंग वेरिएबल घोषित करने के लिए करते हैं, लेकिन मान निरंतर मान की तरह लगता है और मैं ऐसा तरीका खोज रहा हूं, जो एक वैरिएबल की तरह काम कर सकता है, न कि एक वैरिएबल।

उदाहरण के लिए:

\set Comm 150

select sal, sal+:Comm from emp

यहां salवह मान है जो तालिका 'एंपायर' में मौजूद commहै और निरंतर मूल्य है।


2

मुझे ऐसा कुछ करना था

CREATE OR REPLACE FUNCTION MYFUNC()
RETURNS VOID AS $$
DO
$do$
BEGIN
DECLARE
 myvar int;
 ...
END
$do$
$$ LANGUAGE SQL;

2

Postgresql में नंगे चर नहीं हैं, आप एक अस्थायी तालिका का उपयोग कर सकते हैं। चर केवल कोड ब्लॉक में या उपयोगकर्ता-इंटरफ़ेस सुविधा के रूप में उपलब्ध हैं।

यदि आपको एक नंगे चर की आवश्यकता है तो आप एक अस्थायी तालिका का उपयोग कर सकते हैं:

CREATE TEMP TABLE list AS VALUES ('foobar');

SELECT dbo.PubLists.*
FROM   dbo.PubLists,list
WHERE  Name = list.column1;

एक पक्ष-लाभ के रूप में, यह दृष्टिकोण डेटाबेस अज्ञेयवादी है, जो आपके परीक्षणों को बैकएंड में अधिक पोर्टेबल बनाता है।
बिशप

2

@ Nad2000 के जवाब पर और बिल्डिंग @ पावेल का जवाब यहाँ , इस जहां मैं अपने Flyway माइग्रेशन स्क्रिप्ट के लिए समाप्त हो गया है। उन परिदृश्यों के लिए हैंडलिंग जहां डेटाबेस स्कीमा को मैन्युअल रूप से संशोधित किया गया था।

DO $$
BEGIN
    IF NOT EXISTS(
        SELECT TRUE FROM pg_attribute 
        WHERE attrelid = (
            SELECT c.oid
            FROM pg_class c
            JOIN pg_namespace n ON n.oid = c.relnamespace
            WHERE 
                n.nspname = CURRENT_SCHEMA() 
                AND c.relname = 'device_ip_lookups'
            )
        AND attname = 'active_date'
        AND NOT attisdropped
        AND attnum > 0
        )
    THEN
        RAISE NOTICE 'ADDING COLUMN';        
        ALTER TABLE device_ip_lookups
            ADD COLUMN active_date TIMESTAMP;
    ELSE
        RAISE NOTICE 'SKIPPING, COLUMN ALREADY EXISTS';
    END IF;
END $$;


1

उदाहरण परिवर्तन तालिका के लिए चर का उपयोग करने के लिए:

DO $$ 
DECLARE name_pk VARCHAR(200);
BEGIN
select constraint_name
from information_schema.table_constraints
where table_schema = 'schema_name'
      and table_name = 'table_name'
      and constraint_type = 'PRIMARY KEY' INTO name_pk;
IF (name_pk := '') THEN
EXECUTE 'ALTER TABLE schema_name.table_name DROP CONSTRAINT ' || name_pk;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.