Переменные в 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)