Değişkenleri basit bir PostgreSQL komut dosyasında nasıl kullanırsınız?


Yanıtlar:


135

Tam cevap resmi PostgreSQL belgelerinde bulunur .

Yeni PG9.0 anonim kod bloğu özelliğini kullanabilirsiniz ( 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 $$;

Ayrıca son ekleme kimliğini de alabilirsiniz :

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

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

7
(Ve ;sonrasını da unutmayın END $$, böyle END $$;
:.

3
BENİM İÇİN ÇALIŞMIYOR HATA YAKIN YAPIYOR, plpgsql dili ile başlangıç ​​ve bitiş arasında bazı işlevlerim de var.
Ash

53
bu örnekteki kod çalışmıyor. 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
Jasen

1
PostgreSQL'de tamamen yeni olduğum için bu bir süreliğine beni şaşırttı, işte birkaç ipucu: + İfadelerinizi noktalı virgülle bitirdiğinizden emin olun! + Değişken tanımlayıcı olmadığı için belirsiz sütun adlarından kaçınmak için _ veya benzeri bir şey kullanmak isteyebilirsiniz. + Bu DECLARE _accountid INT: = 1 gibi, değişkeni satır içinde bir değere ayarlayabilirsiniz;
The Coder

1
benim için çalışma Sincap kullanmak. Hata: HATA: "$$
Oliver Watkins

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

4
benim için çalışma Sincap kullanmak. Hata: HATA: "$$
Oliver Watkins

1
Değişkeni kullanmak için bunu anlamam biraz zaman aldı olmamalıdır bir öneki :diğer değişkenlerle olarak. @ achilles-ram-nakirekanti bunu selectdaha açık hale getirmek için bunu bir ifadede kullanarak bir örnek ekleyebilirsiniz ?
exhuma

27

Kullanabilirsiniz:

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

Yapacak


3
HATA: "\" konumunda veya yakınında sözdizimi hatası Neyi kaçırıyorum?
SCW

14
@scw Bu yalnızca psqlkonsoldan kullanılabilir. Bunu uygulamanızın SQL'ine yazamazsınız.
owensmartin

@owensmartin Bunu, psql'ye aktarılan her şeyi veya psql'nin okuduğu herhangi bir komut dosyasını kullanabileceksiniz ...
Evan Carroll

4
Bu soruya hiç cevap vermiyor. MS SQL'de, bir sorguda bir var tanımlayabilir ve orada, aynı araçta kullanabilirsiniz. Bu sorunun her versiyonunda, insanların neden bunu bir cevap olarak önerip durduklarını anlamıyorum.
Taş

@stone görünüşe göre bu çok büyük bir "özledim" postgresqlve en az kötü alternatif. genel olarak oldukça memnun oldum postgresql: ama bu şaşırtıcı derecede büyük bir başarısızlık
javadba

10

Plpgsql'de değişken kullanımına bir örnek:

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

Göz at plpgsql docs fazla bilgi için.


4

\setKomut dosyası değişkenini bildirmek için kullandıkları bazı diğer belgelerle karşılaştım, ancak değer sabit bir değer gibi görünüyor ve sabit bir değişken değil bir değişken gibi davranabilecek bir yol buluyorum.

Ör:

\set Comm 150

select sal, sal+:Comm from emp

İşte sal'emp' tablosunda commbulunan değer ve sabit değerdir.


2

Bunun gibi bir şey yapmak zorundaydım

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

2

Postgresql'de çıplak değişkenler yoktur, geçici bir tablo kullanabilirsiniz. değişkenler yalnızca kod bloklarında veya bir kullanıcı arabirimi özelliği olarak kullanılabilir.

Çıplak bir değişkene ihtiyacınız varsa, geçici bir tablo kullanabilirsiniz:

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

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

Bir yan fayda olarak, bu yaklaşım veritabanından bağımsızdır ve testlerinizi arka uçta daha taşınabilir hale getirir.
bishop

2

@ Nad2000 cevabı ve Bina burada Pavel'ın cevap @ , bu benim Flyway göç komut dosyaları için bitti yerdir. Veritabanı şemasının manuel olarak değiştirildiği senaryolar için işleme.

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

Değişkenleri kullanmak için örneğin tabloyu değiştir:

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.