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

Команда RAISE предназначена для инициирования ошибок и исключений в функциях PL/pgSQL. Она передает заданную информацию механизму PostgreSQL elog (стандартное средство ведения протокола ошибок - данные обычно направляются в файл /var/log/messages или $PGDATA/serverlog с одновременным выводом в поток stderr).

В команде RAISE также указывается уровень ошибки и строка, передаваемая PostgreSQL. Кроме того, в команду можно включить переменные и выражения, значения которых будут содержаться в выходных данных. Соответствующие позиции строки помечаются знаками процента (%). Синтаксис команды RAISE: RAISE уровень ''сообщение'' [. идентификатор [...] ]:

В таблице 6.1 приведены допустимые значения уровня ошибки с краткими описани­ями.

Таблица 6.1. Допустимые значения уровня ошибки

Значение Описание
DEBUG Команда уровня DEBUG направляет заданный текст в виде сообщения DEBUG: в журнал PostgreSQL и клиентской программе, если клиент подключен к кластеру базы данных, работающему в отладочном режиме. Команды RAISE уровня DEBUG игнорируются базами данных, работающими в режиме реальной эксплуатации
NOTICE Команда уровня NOTICE направляет заданный текст в виде сообщения NOTICE: в журнал PostgreSQL и клиентской программе. Сообщение передается в любом режиме работы PostgreSQL
EXCEPTION Команда уровня EXCEPTION направляет заданный текст в виде сообщения ERROR: в журнал PostgreSQL и клиентской программе. Ошибка уровня EXCEPTION также вызывает откат текущей транзакции

В листинге 6.41 первая команда RAISE выводит отладочное сообщение, а вторая и третья команды выводят сообщение для пользователя. Обратите внимание на знак % в третьей команде - он отмечает позицию, в которой выводится значение an_integer. Наконец, четвертая команда RAISE выводит сообщение об ошибке и инициирует исключение, приводящее к отмене транзакции.

Листинг 6.41. Команда RAISE

CREATE OR REPLACE FUNCTION books.raise_test()

RETURNS integer AS

$BODY$

DECLARE

-- Объявление целочисленной переменной для тестового вывода.

an_integer integer = 1;

BEGIN

-- Вывести отладочное сообщение уровня

RAISE DEBUG 'Тестирование функции raise_test() началось.';

an_integer = an_integer * 1;

-- Вывести сообщение об изменении переменной an_integer,

-- а затем вывести другое сообщение с ее новым значением.

RAISE NOTICE 'Переменная an_integer была изменена.';

RAISE NOTICE 'Значение переменной an_integer теперь равно %.', an_integer;

-- Инициировать исключение.

RAISE EXCEPTION 'Значение переменной an_integer изменено на %. Транзакция прервана.', an_integer;

RETURN 1;

END;

$BODY$

LANGUAGE 'plpgsql' VOLATILE

В листинге 6.42 приведены результаты, полученные при вызове функции raise_test() из базы данных booktown. Отладочное сообщение DEBUG отсутствует, поскольку база данных работает не в отладочном режиме.

Листинг 6.42. Результаты вызова raise_test()

SELECT books.raise_test();

NOTICE: Переменная an_integer была изменена.

NOTICE: Значение переменной an_integer теперь равно 1.

ERROR: Значение переменной an_integer изменено на 1. Транзакция прервана.

********** Ошибка **********

ERROR: Значение переменной an_integer изменено на 1. Транзакция прервана.

SQL state: P0001


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: