Bagaimana Anda menggunakan variabel dalam skrip PostgreSQL sederhana?

Jawaban:

132

Jawaban lengkapnya ada di dokumentasi resmi PostgreSQL .

Anda dapat menggunakan fitur blok kode anonim PG9.0 baru ( 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 $$;

Anda juga bisa mendapatkan id sisipan terakhir :

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

  SELECT * FROM test WHERE id = lastid;
END $$;
nad2000
sumber
7
(Dan jangan lupa ;setelahnya END $$, seperti:. END $$;)
KajMagnus
3
TIDAK BEKERJA UNTUK SAYA ERROR DEKAT LAKUKAN, Saya juga memiliki beberapa fungsi antara awal dan akhir dengan bahasa plpgsql.
Ash
51
kode dalam contoh ini tidak berfungsi. 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
Menjadi benar-benar baru di PostgreSQL, ini membuat saya kagum, berikut beberapa tip: + Pastikan Anda mengakhiri pernyataan Anda dengan titik koma! + Karena tidak ada pengenal variabel, Anda mungkin ingin menggunakan _ atau sesuatu yang serupa untuk menghindari nama kolom yang ambigu. + Anda dapat mengatur variabel ke nilai sejalan menggunakan seperti ini MENYATAKAN _accountid INT: = 1;
The Coder
1
jangan bekerja untukku. Menggunakan tupai. Kesalahan: ERROR: string kutipan dolar tidak diselesaikan pada atau dekat "$$
Oliver Watkins
39
DO $$
DECLARE  
   a integer := 10;  
   b integer := 20;  
   c integer;  
BEGIN  
   c := a + b;
    RAISE NOTICE'Value of c: %', c;
END $$;
Achilles Ram Nakirekanti
sumber
3
jangan bekerja untukku. Menggunakan tupai. Kesalahan: ERROR: string kutipan dolar tidak diselesaikan pada atau dekat "$$
Oliver Watkins
1
Butuh beberapa saat bagi saya untuk mengetahui bahwa untuk menggunakan variabel Anda tidak boleh mengawalnya dengan a :seperti variabel lainnya. @ achilles-ram-nakirekanti Anda dapat menambahkan contoh menggunakan ini dalam selectpernyataan untuk membuat ini lebih jelas?
exhuma
28

Kamu bisa memakai:

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

Itu akan berhasil

Karim de Alba
sumber
3
EROR: kesalahan sintaks pada atau dekat "\" Apa yang saya lewatkan?
scw
14
@scw Ini hanya tersedia dari psqlkonsol. Anda tidak akan bisa menulis ini di SQL aplikasi Anda.
owensmartin
@owensmartin Anda akan dapat menggunakan ini adalah apa pun yang disalurkan ke psql .. atau skrip apa pun yang dibaca psql ...
Evan Carroll
4
Ini sama sekali tidak menjawab pertanyaan itu. Di MS SQL Anda dapat menentukan var dalam kueri dan menggunakannya di sana, di alat yang sama. Saya tidak mengerti mengapa orang terus mengajukan ini sebagai jawaban, di setiap versi pertanyaan ini.
Batu
@stone tampaknya karena ini adalah "kesalahan" yang besar postgresqldan ini adalah alternatif yang paling tidak terburuk. Secara umum saya cukup puas postgresql: tetapi ini adalah kegagalan yang sangat besar
javadba
10

Berikut adalah contoh penggunaan variabel di 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

Silahkan lihat di docs plpgsql untuk informasi lebih lanjut.

terlalu banyak berpikir
sumber
4

Saya telah menemukan beberapa dokumen lain yang mereka gunakan \setuntuk mendeklarasikan variabel scripting tetapi nilainya tampaknya seperti nilai konstan dan saya menemukan cara yang dapat bertindak seperti variabel bukan variabel konstan.

Ex:

\set Comm 150

select sal, sal+:Comm from emp

Berikut saladalah nilai yang ada di tabel 'emp' dan commmerupakan nilai konstanta.

Vinodraj
sumber
2

Saya harus melakukan sesuatu seperti ini

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

Postgresql tidak memiliki variabel kosong, Anda dapat menggunakan tabel sementara. variabel hanya tersedia dalam blok kode atau sebagai fitur antarmuka pengguna.

Jika Anda membutuhkan variabel kosong, Anda dapat menggunakan tabel sementara:

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

SELECT dbo.PubLists.*
FROM   dbo.PubLists,list
WHERE  Name = list.column1;
Jasen
sumber
Sebagai manfaat sampingan, pendekatan ini adalah database agnostik, membuat pengujian Anda lebih portabel di seluruh backend.
uskup
2

Berdasarkan jawaban @ nad2000 dan jawaban @ Pavel di sini , di sinilah saya berakhir untuk skrip migrasi Jalur Terbang saya. Penanganan skenario di mana skema database diubah secara manual.

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 $$;
Shane
sumber
1

Untuk klien CLI resmi "psql" lihat di sini . Dan "pgAdmin3" 1.10 (masih dalam versi beta) memiliki " pgScript ".

Milen A. Radev
sumber
1

Untuk menggunakan variabel, misalnya mengubah tabel:

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;
David Leon
sumber