Обработка ошибок и исключений
Команда 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
Дата добавления: 2015-02-03; просмотров: 888;