it-swarm.com.de

Wie verwenden Sie Variablen in einem einfachen PostgreSQL-Skript?

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

80
ChristineDev

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 $$;
116
nad2000
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

21
Karim de Alba

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 .

9
overthink

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. 

3
Vinodraj

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 $$;
2
Shane

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

Ich musste so etwas tun

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

Für den offiziellen CLI-Client "psql" siehe hier . Und "pgAdmin3" 1.10 (noch in der Beta) hat " pgScript ".

0
Milen A. Radev

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;
0
Jasen