• Иллюстрированный самоучитель по 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, чтобы сообщить об этом редактору.