আপনি কীভাবে একটি সাধারণ পোস্টগ্রিজ এসকিউএল স্ক্রিপ্টে ভেরিয়েবল ব্যবহার করবেন?


103

উদাহরণস্বরূপ, এমএস-এসকিউএল এ, আপনি একটি ক্যোয়ারী উইন্ডো খুলতে এবং নিম্নলিখিতটি চালাতে পারেন:

DECLARE @List AS VARCHAR(8)

SELECT @List = 'foobar'

SELECT *
FROM   dbo.PubLists
WHERE  Name = @List

পোস্টগ্রিসএসকিউএল এ কিভাবে হয়? এটা করা যায়?


4
সংক্রান্ত প্রশ্ন: stackoverflow.com/q/1490942/330315 এবং stackoverflow.com/q/13316773/330315
a_horse_with_no_name

উত্তর:


135

সম্পূর্ণ উত্তরটি অফিসিয়াল পোস্টগ্র্যাস এসকিউএল ডকুমেন্টেশনে অবস্থিত ।

আপনি নতুন 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 $$;
:)

4
আমার ত্রুটির কাছাকাছি কাজ করবেন না, plpgsql ভাষার সাথে আমার শুরু এবং শেষের মধ্যে কিছু ফাংশন রয়েছে।
অ্যাশ

53
এই উদাহরণে কোড কাজ করে না। 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
জেসেন

4
পোস্টগ্রেএসকিউএল-এ সম্পূর্ণরূপে নতুন হওয়ার কারণে এটি আমাকে কিছু সময়ের জন্য ছুঁড়ে ফেলেছে, এখানে আরও কয়েকটি টিপস রয়েছে: + নিশ্চিত করুন যে আপনি আপনার বক্তব্যকে একটি সেমিকোলন দিয়ে শেষ করেছেন! + কারণ কোনও পরিবর্তনশীল শনাক্তকারী নেই কারণ আপনি অস্পষ্ট কলামের নামগুলি এড়াতে একটি _ বা অনুরূপ কিছু ব্যবহার করতে চাইতে পারেন। আপনি এই ভেরিয়েবলটি এই ডেক্লারে _এক্কায়েন্টড INT এর মতো করে লাইনে একটি মানতে সেট করতে পারেন: = 1;
কোডার

4
আমার জন্য কাজ করবেন না। কাঠবিড়ালি ব্যবহার। ত্রুটি: ত্রুটি: বা কাছাকাছি "$$ অসমাপ্ত ডলার-উদ্ধৃত পংক্তি
অলিভার ওয়াটকিনস্

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

4
আমার জন্য কাজ করবেন না। কাঠবিড়ালি ব্যবহার। ত্রুটি: ত্রুটি: বা কাছাকাছি "$$ অসমাপ্ত ডলার-উদ্ধৃত পংক্তি
অলিভার ওয়াটকিনস্

4
ভেরিয়েবলটি ব্যবহার করার জন্য আপনাকে অন্য ভেরিয়েবলগুলির মতো এটির উপ-উপকরণ স্থাপন করতে হবে না বলে আমাকে কিছুক্ষণ সময় নিয়েছিল :। @ আচিলিস-রাম-নাকিরকান্তি আপনি কি এই selectবিবৃতিতে আরও পরিষ্কার করে তুলতে একটি উদাহরণ যুক্ত করতে পারেন ?
exhuma

27

তুমি ব্যবহার করতে পার:

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

তা করতে হবে


4
ত্রুটি: "\" এর কাছাকাছি বা কাছাকাছি সিনট্যাক্স ত্রুটি আমি কী অনুপস্থিত?
স্ক্যান্ড 17

14
@scw এটি কেবল psqlকনসোল থেকে উপলব্ধ । আপনি আপনার অ্যাপের এসকিউএল এ এটি লিখতে সক্ষম হবেন না।
ওউন্সমার্টিন

@owensmartin আপনি ব্যবহার করতে সক্ষম হবেন এই যে কিছু psql মাধ্যমে পাইপ হয় .. বা কোনো স্ক্রিপ্ট যে psql সার্চ হচ্ছে ...
ইভান ক্যারল

4
এটি প্রশ্নের কোনও উত্তর দেয় না। এমএস এসকিউএল এ আপনি একটি ক্যোয়ারিতে একটি বর্ণ নির্ধারণ করতে পারেন এবং একই সরঞ্জামে এটি ব্যবহার করতে পারেন। লোকেরা কেন এই প্রশ্নের প্রতিটি সংস্করণে উত্তর হিসাবে এটি প্রস্তাব রাখে তা আমি পাই না।
পাথর

@ স্টোন স্পষ্টতই কারণ এটি একটি বিশাল "মিস" 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;

পার্শ্ব-উপকার হিসাবে, এই পদ্ধতির ডেটাবেস অজ্ঞোস্টিক, আপনার পরীক্ষাগুলি ব্যাকএন্ডে আরও বহনযোগ্য করে তোলে।
বিশপ 18

2

@ নাদ 2000 এর উত্তর এবং @ পাভেলের উত্তরের ভিত্তিতে এখানে বিল্ডিং , আমি এখানেই আমার ফ্লাইওয়ে মাইগ্রেশন স্ক্রিপ্টগুলি শেষ করেছি। যেখানে ডেটাবেস স্কিমাটি ম্যানুয়ালি সংশোধন করা হয়েছিল সেই দৃশ্যের জন্য পরিচালনা করা।

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;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.