Как вы используете переменные в простом скрипте PostgreSQL? - PullRequest
85 голосов
/ 20 апреля 2009

Например, в MS-SQL вы можете открыть окно запроса и выполнить следующее:

DECLARE @List AS VARCHAR(8)

SELECT @List = 'foobar'

SELECT *
FROM   dbo.PubLists
WHERE  Name = @List

Как это делается в PostgreSQL? Можно ли это сделать?

Ответы [ 9 ]

119 голосов
/ 09 августа 2011

Полный ответ находится в официальной документации PostgreSQL .

Вы можете использовать новую функцию блокировки анонимного кода 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 $$;

Также вы можете получить последнюю вставку id:

DO $$
DECLARE lastid bigint;
BEGIN
  INSERT INTO test (name) VALUES ('Test Name') 
  RETURNING id INTO lastid;

  SELECT * FROM test WHERE id = lastid;
END $$;
27 голосов
/ 31 марта 2016
DO $$
DECLARE  
   a integer := 10;  
   b integer := 20;  
   c integer;  
BEGIN  
   c := a + b;
    RAISE NOTICE'Value of c: %', c;
END $$;
23 голосов
/ 28 апреля 2013

Вы можете использовать:

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

Что будет делать

9 голосов
/ 12 мая 2009

Вот пример использования переменной в 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

Для получения дополнительной информации посмотрите plpgsql документы

3 голосов
/ 29 июля 2010

Я сталкивался с некоторыми другими документами, которые используют \set для объявления переменной сценария, но значение похоже на постоянное значение, и я нахожу способ, который может действовать как переменная, а не как постоянная переменная.

Ex:

\set Comm 150

select sal, sal+:Comm from emp

Здесь sal - это значение, которое присутствует в таблице «emp», а comm - это постоянное значение.

2 голосов
/ 26 сентября 2018

Опираясь на ответ @ nad2000 и @ ответ Павла здесь , я остановился на сценариях миграции Flyway. Обработка сценариев, в которых схема базы данных была изменена вручную.

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 $$;
1 голос
/ 30 декабря 2016

Я должен был сделать что-то вроде этого

CREATE OR REPLACE FUNCTION MYFUNC()
RETURNS VOID AS $$
DO
$do$
BEGIN
DECLARE
 myvar int;
 ...
END
$do$
$$ LANGUAGE SQL;
0 голосов
/ 31 декабря 2016

Postgresql не имеет пустых переменных, вы можете использовать временную таблицу. переменные доступны только в кодовых блоках или как функция пользовательского интерфейса.

Если вам нужна пустая переменная, вы можете использовать временную таблицу:

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

SELECT dbo.PubLists.*
FROM   dbo.PubLists,list
WHERE  Name = list.column1;
0 голосов
/ 20 апреля 2009

Для официального клиента CLI "psql" см. здесь . И "pgAdmin3" 1.10 (все еще в бета-версии) имеет " pgScript ".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...