In MS-SQL können Sie beispielsweise ein Abfragefenster öffnen und Folgendes ausführen:
DECLARE @List AS VARCHAR(8)
SELECT @List = 'foobar'
SELECT *
FROM dbo.PubLists
WHERE Name = @List
Wie wird das in PostgreSQL gemacht? Kann es gemacht werden
Die vollständige Antwort finden Sie in der offiziellen PostgreSQL-Dokumentation .
Sie können die neue anonyme Codeblockfunktion von PG9.0 verwenden ( 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 $$;
Sie können auch die letzte insert id erhalten:
DO $$
DECLARE lastid bigint;
BEGIN
INSERT INTO test (name) VALUES ('Test Name')
RETURNING id INTO lastid;
SELECT * FROM test WHERE id = lastid;
END $$;
DO $$
DECLARE
a integer := 10;
b integer := 20;
c integer;
BEGIN
c := a + b;
RAISE NOTICE'Value of c: %', c;
END $$;
Sie können verwenden:
\set list '''foobar'''
SELECT * FROM dbo.PubLists WHERE name = :list;
Das wird reichen
Hier ist ein Beispiel für die Verwendung einer Variablen in 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
Weitere Informationen finden Sie in der Datei plpgsql docs .
Ich bin auf einige andere Dokumente gestoßen, die \set
verwenden, um die Skriptvariable zu deklarieren, aber der Wert scheint wie ein konstanter Wert zu sein, und ich finde einen Weg, der sich wie eine Variable und keine konstante Variable verhält.
Ex:
\set Comm 150
select sal, sal+:Comm from emp
Hier ist sal
der Wert, der in der Tabelle 'emp' vorhanden ist, und comm
ist der konstante Wert.
Aufbauend auf der Antwort von @nad2000 und der Antwort von @ Pavel hier landete ich hier für meine Flyway-Migrationsskripts. Behandlung von Szenarien, in denen das Datenbankschema manuell geändert wurde.
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 $$;
Für die Verwendung von Variablen in zum Beispiel alter table:
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;
Ich musste so etwas tun
CREATE OR REPLACE FUNCTION MYFUNC()
RETURNS VOID AS $$
DO
$do$
BEGIN
DECLARE
myvar int;
...
END
$do$
$$ LANGUAGE SQL;
Postgresql hat keine leeren Variablen. Sie können eine temporäre Tabelle verwenden. Die Variablen sind nur in Codeblöcken oder als Benutzeroberflächenfeature verfügbar.
Wenn Sie eine leere Variable benötigen, können Sie eine temporäre Tabelle verwenden:
CREATE TEMP TABLE list AS VALUES ('foobar');
SELECT dbo.PubLists.*
FROM dbo.PubLists,list
WHERE Name = list.column1;