Обработка ошибок и исключений
Команда RAISE предназначена для инициирования ошибок и исключений в функциях PL/pgSQL. Она передает заданную информацию механизму PostgreSQL elog (стандартное средство ведения протокола ошибок – данные обычно направляются в файл /var/log/messages или $PGDATA/serverlog с одновременным выводом в поток stderr).
В команде RAISE также указывается уровень ошибки и строка, передаваемая PostgreSQL. Кроме того, в команду можно включить переменные и выражения, значения которых будут содержаться в выходных данных. Соответствующие позиции строки помечаются знаками процента (%).
Синтаксис команды RAISE:
RAISE уровень ''сообщение'' [. идентификатор […] ]:
В табл. 11.1 приведены три допустимые значения уровня ошибки с краткими описаниями.
Таблица 11.1. Допустимые значения уровня ошибки.
Значение | Описание |
---|---|
DEBUG | Команда уровня DEBUG направляет заданный текст в виде сообщения DEBUG: в журнал PostgreSQL и клиентской программе, если клиент подключен к кластеру базы данных, работающему в отладочном режиме. Команды RAISE уровня DEBUG игнорируются базами данных, работающими в режиме реальной эксплуатации |
NOTICE | Команда уровня NOTICE направляет заданный текст в виде сообщения NOTICE: в журнал PostgreSQL и клиентской программе. Сообщение передается в любом режиме работы PostgreSQL |
EXCEPTION | Команда уровня EXCEPTION направляет заданный текст в виде сообщения ERROR: в журнал PostgreSQL и клиентской программе. Ошибка уровня EXCEPTION также вызывает откат текущей транзакции |
В листинге 11.48 первая команда RAISE выводит отладочное сообщение, а вторая и третья команды выводят сообщение для пользователя. Обратите внимание на знак % в третьей команде – он отмечает позицию, в которой выводится значение an_integer. Наконец, четвертая команда RAISE выводит сообщение об ошибке и инициирует исключение, приводящее к отмене транзакции.
Листинг 11.48. Команда RAISE.
CREATE FUNCTION raise_test () RETURNS integer AS ' DECLARE --Объявление целочисленной переменной для тестового вывода. an_integer integer = 1; BEGIN – Вывести отладочное сообщение уровня DEBUG. RAISE DEBUG "The raise_test() function began.": an_integer = an_integer * 1; --Вывести сообщение об изменении переменной an_integer, --а затем вывести другое сообщение с ее новым значением. RAISE NOTICE "Variable anjnteger was cnanged."; RAISE NOTICE "Variable anjnteger's value is now £." anjnteger; --Инициировать исключение. RAISE EXCEPTION "Variable % cnanged. Transaction aborted. ",anjnteger: RETURN 1: END; ' LANGUAGE 'plpgsql':
В листинге 11.49 приведены результаты, полученные при вызове функции raise_test() из базы данных booktown. Отладочное сообщение DEBUG отсутствует, поскольку база данных работает не в отладочном режиме.
Листинг 11.49. Результаты вызова raise_test().
booktown=# SELECT raise_test(); NOTICE: Variable anjnteger was changed. NOTICE: Variable anjnteger's value is now 2. ERROR: Variable 2 changed. Aborting transaction.