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?
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 $$;
DO $$
DECLARE
a integer := 10;
b integer := 20;
c integer;
BEGIN
c := a + b;
RAISE NOTICE'Value of c: %', c;
END $$;
Vous pouvez utiliser:
\set list '''foobar'''
SELECT * FROM dbo.PubLists WHERE name = :list;
Ça va faire
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.
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.
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 $$;
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;
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;
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;