Иллюстрированный самоучитель по PostgreSQL

Работа с переменными

Клиент psql также позволяет работать с переменными. Команда \set создает и модифицирует переменные, а команда \unset удаляет их. Переменные psql работают так же, как переменные среды в командных интерпретаторах Unix и Linux (например, bash). Хотя в целом переменные psql реализованы довольно просто, они приносят несомненную пользу, поскольку значения переменных легко подставляются в управляющие команды psql и в команды SQL.

Примечание
При работе с переменными следует помнить, что в psql существует несколько внутренних переменных. Присваивание этим переменным произвольных значений может иметь непредсказуемые и нежелательные последствия для работы программы. Список этих переменных и их возможное применение рассматриваются в приложении D
.

Новое значение переменной задается командой \set, за которой указываются имя и значение, разделенные пробелами. Команда либо изменяет значение существующей переменной, либо создает новую переменную, если переменная с указанным именем не существует. Имя переменной имеет произвольную длину и содержит произвольную комбинацию букв, цифр и символов подчеркивания, а значение переменной может быть строкой любой длины. Пример приведен в листинге 6.2.

Листинг 6.2. Присваивание значения переменной.

testdb=# \set myvariable 'There are many like it .but this one is mine.'

Если теперь ввести команду \set без аргументов, переменная появляется в общем списке.

Листинг 6.3. Список переменных.

testdb-# \set
VERSION = 'PostgreSQL 7.1.3 on i586-pc-linux-gnu .compiled by GCC 2.96'
DBNAME = 'testdb1
USER = 'postgres'
PORT = '5432'
ENCODING = 'SQL_ASCII'
PROMPT1 = '%/№%# '
PROMPT2 = '*/та# '
PROMPTS = '>> '
HISTSIZE = '500'
myvariable = 'There are many like it .but this one is mine.'

После определения переменной ее можно включать как во внутренние управляющие команды psql, так и в команды SQL. Подстановка значения переменной вместо ее имени называется интерполяцией. Механизм интерполяции открывает много полезных возможностей – например, можно загрузить файл в переменную, а затем использовать загруженное содержимое в команде INSERT или SELECT. Возможны и более простые подстановки.

Чтобы подставить значение переменной, укажите перед ее именем префикс:. В листинге 6.4 приведен пример интерполяции в командах INSERT и SELECT.

Листинг 6.4. Интерполяция в командах SQL.

testdb=# \set manager_id 150
testdb=# INSERT INTO employees VALUES (
testdb(# 'Kevin', testdb(# 'Murphy',
testdb(#:manager_id
testdb(#):
testdb=# SELECT * FROM employees WHERE id =:manager_id;
firstname I lastname I id
Kevin | Murphy | 150
(1 row)

Как упоминалось выше, в переменную можно загрузить содержимое файла, а затем интерполировать ее в другую команду. Для этого присвойте переменной результат выполнения команды cat (команда Unix, предназначенная для вывода содержимого файла), заключенный в обратные апострофы (' '). В листингах 6.5 и 6.6 в качестве примера используется файл tabledata, находящийся в домашнем каталоге пользователя (~/).

Листинг 6.5. Чтение данных из файла в переменную.

testdb=# \set data 'cat tabledata'
testdb=# \echo:data
'Mike'. 'Nelson'. 151

Листинг 6.6. Интерполяция переменной в команде INSERT.

testdb=# INSERT INTO employees VALUES (-.data):

После листинга 6.6 в таблице employees появляется новая запись со значениями полей, загруженными из переменной data.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.