web-dev-qa-db-fra.com

Comment utilisez-vous les variables dans un script PostgreSQL simple?

Par exemple, dans MS-SQL, vous pouvez ouvrir une fenêtre de requête et exécuter ce qui suit:

DECLARE @List AS VARCHAR(8)

SELECT @List = 'foobar'

SELECT *
FROM   dbo.PubLists
WHERE  Name = @List

Comment cela se fait-il dans PostgreSQL? Cela peut-il être fait?

80
ChristineDev

La réponse complète se trouve dans documentation officielle de PostgreSQL .

Vous pouvez utiliser la nouvelle fonctionnalité de blocage de code anonyme PG9.0 ( 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 $$;

Aussi, vous pouvez obtenir le dernier insert id:

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 $$;
27

Vous pouvez utiliser:

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

Ça va faire

21
Karim de Alba

Voici un exemple d'utilisation d'une variable dans 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

Jetez un coup d’œil à/ plpgsql docs pour plus d’informations.

9
overthink

Je suis tombé sur d'autres documents qu'ils utilisent \set pour déclarer une variable de script, mais la valeur semble être une valeur constante et je trouve que, d'une manière qui peut être, agit comme une variable et non une variable constante.

Ex:

\set Comm 150

select sal, sal+:Comm from emp

Ici sal est la valeur présente dans la table 'emp' et comm est la valeur constante. 

3
Vinodraj

En me basant sur la réponse de @ nad2000 et @ la réponse de Pavel ici , c'est là que je me suis retrouvé pour mes scripts de migration Flyway. Gestion des scénarios dans lesquels le schéma de base de données a été modifié manuellement.

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

Pour utiliser les variables dans par exemple 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

Je devais faire quelque chose comme ça

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

Pour le client CLI officiel "psql", voir ici . Et "pgAdmin3" 1.10 (toujours en version bêta) a " pgScript ".

0
Milen A. Radev

Postgresql n'a pas de variables nues, vous pouvez utiliser une table temporaire . Les variables ne sont disponibles que dans des blocs de code ou en tant que fonctionnalité d'interface utilisateur.

Si vous avez besoin d'une variable nue, vous pouvez utiliser une table temporaire:

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

SELECT dbo.PubLists.*
FROM   dbo.PubLists,list
WHERE  Name = list.column1;
0
Jasen