Örneğin MS-SQL'de bir sorgu penceresi açabilir ve aşağıdakileri çalıştırabilirsiniz:
DECLARE @List AS VARCHAR(8)
SELECT @List = 'foobar'
SELECT *
FROM dbo.PubLists
WHERE Name = @List
PostgreSQL'de bu nasıl yapılır? Yapılabilir mi?
Örneğin MS-SQL'de bir sorgu penceresi açabilir ve aşağıdakileri çalıştırabilirsiniz:
DECLARE @List AS VARCHAR(8)
SELECT @List = 'foobar'
SELECT *
FROM dbo.PubLists
WHERE Name = @List
PostgreSQL'de bu nasıl yapılır? Yapılabilir mi?
Yanıtlar:
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 $$;
;
sonrasını da unutmayın END $$
, böyle END $$;
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
DO $$
DECLARE
a integer := 10;
b integer := 20;
c integer;
BEGIN
c := a + b;
RAISE NOTICE'Value of c: %', c;
END $$;
:
diğer değişkenlerle olarak. @ achilles-ram-nakirekanti bunu select
daha açık hale getirmek için bunu bir ifadede kullanarak bir örnek ekleyebilirsiniz ?
Kullanabilirsiniz:
\set list '''foobar'''
SELECT * FROM dbo.PubLists WHERE name = :list;
Yapacak
psql
konsoldan kullanılabilir. Bunu uygulamanızın SQL'ine yazamazsınız.
postgresql
ve 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
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.
\set
Komut 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 comm
bulunan değer ve sabit değerdir.
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;
@ 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 $$;
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;