Как вы используете скриптовые переменные в PSQL? - PullRequest
114 голосов
/ 31 августа 2008

В MS SQL Server я создаю свои скрипты для использования настраиваемых переменных:

DECLARE @somevariable int  
SELECT @somevariable = -1

INSERT INTO foo VALUES ( @somevariable )

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

Как мне сделать то же самое с клиентом PostgreSQL psql?

Ответы [ 13 ]

2 голосов
/ 28 марта 2012

Я нашел этот вопрос и ответы чрезвычайно полезными, но и запутанными. У меня было много проблем, чтобы заставить работать переменные в кавычках, поэтому вот как я это сделал:

\set deployment_user username    -- username
\set deployment_pass '\'string_password\''
ALTER USER :deployment_user WITH PASSWORD :deployment_pass;

Таким образом, вы можете определить переменную в одном выражении. Когда вы используете его, в переменную будут вставлены одинарные кавычки.

ВНИМАНИЕ! Когда я помещаю комментарий после указанной в кавычках переменной, он засасывается как часть переменной, когда я пробовал некоторые методы в других ответах. Это действительно меня немного смутило. С этим методом комментарии выглядят так, как вы ожидаете.

1 голос
/ 23 января 2019

Я разместил новое решение для этого в другой теме .

Он использует таблицу для хранения переменных и может быть обновлен в любое время. Статическая неизменяемая функция-получатель создается динамически (другой функцией) и запускается обновлением таблицы. Вы получаете отличное хранилище для столов, плюс невероятно высокие скорости неизменного добытчика.

1 голос
/ 10 ноября 2018

Переменные в psql отстой. Если вы хотите объявить целое число, вы должны ввести целое число, затем выполнить возврат каретки, а затем завершить оператор точкой с запятой. Обратите внимание:

Допустим, я хочу объявить целочисленную переменную my_var и вставить ее в таблицу test:

Пример таблицы test:

thedatabase=# \d test;
                         Table "public.test"
 Column |  Type   |                     Modifiers                     
--------+---------+---------------------------------------------------
 id     | integer | not null default nextval('test_id_seq'::regclass)
Indexes:
    "test_pkey" PRIMARY KEY, btree (id)

Понятно, что в этой таблице еще ничего нет:

thedatabase=# select * from test;
 id 
----
(0 rows)

Мы объявляем переменную. Обратите внимание на точку с запятой в следующей строке!

thedatabase=# \set my_var 999
thedatabase=# ;

Теперь мы можем вставить. Мы должны использовать этот странный синтаксис ":''":

thedatabase=# insert into test(id) values (:'my_var');
INSERT 0 1

Сработало!

thedatabase=# select * from test;
 id  
-----
 999
(1 row)

Пояснение:

Итак ... что произойдет, если у нас нет точки с запятой в следующей строке? Переменная? Посмотрите:

Мы объявляем my_var без новой строки.

thedatabase=# \set my_var 999;

Давайте выберем my_var.

thedatabase=# select :'my_var';
 ?column? 
----------
 999;
(1 row)

WTF это? Это не целое число , это строка 999;!

thedatabase=# select 999;
 ?column? 
----------
      999
(1 row)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...