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

Обработка ошибок и исключений

Команда 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.
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.