Самоучитель по SQL-сервер в Linux



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

Клиент 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 в качестве примера используется файл tab! edata, находящийся в домашнем каталоге пользователя (~/).

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

testdb=# \set data 'cat tabledata'

testdb=# \echo :data

'Mike'. 'Nelson'. 151

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

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

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

Настройка приглашения psql

Клиент psql допускает полную настройку внешнего вида своего приглашения. Например, это позволяет выводить различную полезную информацию наиболее простым и наглядным способом (что может быть нагляднее приглашения, в котором вводятся данные?) В psql данные приглашения хранятся в переменных PROMPT1, PROMPT2 и PROMPTS. В разных ситуациях программа отображает разные варианты приглашения.

Переменная PROMPT1 содержит стандартное приглашение, используемое по умолчанию. Переменная PROMPT2 содержит приглашение, выводимое в новой строке незавершенной команды или запроса (то есть запрос не был завершен символом ; и для него не выполнялась команда \д). Приглашение, хранящееся в переменной PROMPTS, отображается при вводе данных во время выполнения команды SQL COPY. Чтобы узнать текущую настройку приглашений, введите команду \set без аргументов — на экране появляется список текущих переменных. Найдите в нем переменные PROMPT1, PROMPT2 и PROMPTS. Их значения, заключенные в апострофы, определяют внешний вид приглашений psql. Символы с префиксом % (например, %т) являются переменными; остальные символы выводятся в точности так, как показано.

В табл. 6.1 приведены значения по умолчанию для всех трех переменных. Обратите внимание, во второй строке (в примере для PROMPT2) предполагается, что в незавершенном запросе имеется открывающая круглая скобка, вследствие чего знаку # предшествует символ (.

Таблица 6.1. Настройка приглашений по умолчанию

Приглашение

Переменная

Пример

PROMPT1

'8/SW1

testcBHf

PROMPT2

%1%Ш '

testdb(f

PROMPTS

' » '

»

Изменение приглашений

Чтобы изменить приглашение psql, достаточно изменить значение соответствующей переменной командой \set. Символ % является префиксом стандартных переменных, перечисленных в табл. 6.2. Символ \п используется для перевода строки, остальные символы выводятся обычным образом. Команда в листинге 6.7 изменяет переменную PROMPT1 и включает в стандартное приглашение дополнительный префикс psql:.

Листинг 6.7. Настройка приглашений

testdb=# Nset PROMPT1 'psql:%/%R%#'

psql:testdb=#

Таблица 6.2. Стандартные переменные в приглашениях

Обозначение

Описание

%~

Имя текущей базы данных. Если используется база данных по умолчанию, в приглашении выводится тильда (~)

и

Знак #, если текущий пользователь зарегистрирован в качестве суперпользователя базы данных. В противном случае выводится знак >

%>

Номер порта, на котором сервер базы данных принимает подключения

%/

Имя текущей базы данных

Имя сервера, на котором работает PostgreSQL, усеченное до первой точки (например, «yourserver.com» в приглашении превращается в «yourserver»)

IM

Полное имя сервера, на котором работает PostgreSQL. Если информация недоступна, в приглашении выводится строка «localhost»

%п

Текущее имя пользователя базы данных

%R

В приглашении PROMPT1 обычно выводится знак равенства (=); в строчном режиме выводится знак л; при разрыве связи с сервером выводится восклицательный знак (!). В приглашении PROMPT2 вместо знака равенства обычно выводится дефис (-), а в начале новой строки в незавершенной команде выводится соответствующий символ (например, если в многострочном запросе осталась открытая круглая скобка, то переменная Ж включит круглую скобку в приглашение). В приглашении PROMPT3 не выводится ничего

% ЧИСЛО

Символ, заданный в виде десятичного, восьмеричного или шестнадцатеричного кода. Восьмеричные коды имеют префикс 0; шестнадцатеричные коды имеют префикс Ох; остальные числа интерпретируются как десятичные

% : переменная

Значение переменной в psql задается с префиксом :

% 'команда

В приглашение вставляются выходные данные заданной команды

Примеры приглашений

Комбинируя разные переменные в команде \set, можно придать приглашению любую желаемую форму. Пример создания нового приглашения для переменной PROMPT1 приведен в листингах 6.8 и 6.9.

Листинг 6.8. Создание приглашения с именем хоста, портом и именем пользователя

testdb=# \set PROMPT1 '[*m:*>:*n;]«/)= '

[host:5432:postgres](testdb)=

Листинг 6.9. Создание приглашения с текущей датой, именем базы данных и именем пользователя

testdb=# \set PROMPT1 '\

[Fri Aug 3 21:44:30 POT 2001]

postgres:testdb=#