Работа с переменными
Клиент 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.