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 geht das in PostgreSQL? Kann es gemacht werden?
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 geht das in PostgreSQL? Kann es gemacht werden?
Antworten:
Die vollständige Antwort finden Sie in der offiziellen PostgreSQL-Dokumentation .
Sie können die neue Funktion zum Blockieren des anonymen PG9.0-Codes 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 Einfügungs- 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 $$;
;
nach END $$
, etwa so: 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 $$;
:
wie bei anderen Variablen ein Präfix voranstellen dürfen , um sie zu verwenden . @ achilles-ram-nakirekanti könnten Sie ein Beispiel hinzufügen, indem Sie dies in einer select
Anweisung verwenden, um dies klarer zu machen?
Sie können verwenden:
\set list '''foobar'''
SELECT * FROM dbo.PubLists WHERE name = :list;
Das wird reichen
psql
Konsole verfügbar . Sie können dies nicht in SQL Ihrer App schreiben.
postgresql
und es die am wenigsten schlimmste Alternative ist. Im Allgemeinen war ich ziemlich zufrieden mit postgresql
: aber dies ist ein überraschend großer Fehler
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 den plpgsql-Dokumenten .
Ich bin auf einige andere Dokumente gestoßen, die sie verwenden \set
zum Deklarieren von Skriptvariablen verwendet werden, aber der Wert scheint wie ein konstanter Wert zu sein, und ich finde heraus, wie sich eine Variable und keine konstante Variable verhalten kann.
Ex:
\set Comm 150
select sal, sal+:Comm from emp
Hier sal
ist der Wert, der in der Tabelle 'emp' vorhanden ist und comm
der konstante Wert ist.
Postgresql hat keine nackten Variablen, Sie könnten eine temporäre Tabelle verwenden. Variablen sind nur in Codeblöcken oder als Benutzeroberflächenfunktion verfügbar.
Wenn Sie eine nackte 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;
Aufbauend auf der Antwort von @ nad2000 und der Antwort von @ Pavel hier landete ich hier für meine Flyway-Migrationsskripte. 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 beispielsweise 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;