Для вывода сообщений и формирования ошибок используется оператор RAISE statement to report messages and
raise errors.
RAISE [level] 'format' [,expression[, ... ]] [ USINGoption=expression[, ... ] ]; RAISE [level]condition_name[ USINGoption=expression[, ... ] ]; RAISE [level] SQLSTATE 'sqlstate' [ USINGoption=expression[, ... ] ]; RAISE [level] USINGoption=expression[, ... ]; RAISE ;
Параметр level определяет уровень серьезности ошибки. Допустимыми уровнями являются DEBUG,
LOG, INFO,
NOTICE, WARNING,
и EXCEPTION, причем EXCEPTION
используется по умолчанию.
EXCEPTION генерирует ошибку (которая обычно прерывает текущую транзакцию); на других уровнях только создаются сообщения с различными приоритетами. Выводятся ли сообщения определенного приоритета клиенту, записываются ли они в журнал сервера или выполняется и то, и другое, определяется
log_min_messages и
client_min_messages конфигурационными
переменными. См. Глава 3.4 для получения дополнительной
информации.
После level если они есть,
можно указать format строку
(которая должна быть простым строковым литералом, а не выражением). Форматная строка определяет текст выводимого сообщения об ошибке. За форматной строкой могут следовать необязательные выражения аргументов, вставляемые в сообщение. Внутри форматной строки % заменяется строковым представлением значения следующего необязательного аргумента. Для вывода
%% литерала %.
Количество аргументов должно соответствовать количеству %
заполнителей в строке формата, иначе при компиляции функции возникнет
ошибка.
В данном примере значение v_job_id заменит
% в строке:
RAISE NOTICE 'Calling cs_create_job(%)', v_job_id;
К отчету об ошибке можно добавить дополнительную информацию, указав
USING после чего следуют option = expression элементы. Каждый параметр
expression может быть любым
строковым выражением. Допустимыми option ключевыми словами являются:
MESSAGE #Задает текст сообщения об ошибке. Данный параметр нельзя использовать в
форме RAISE которая содержит строку форматирования
перед USING.
DETAIL #Позволяет указать подробное сообщение об ошибке.
HINT #Позволяет указать текст подсказки.
ERRCODE #Определяет код ошибки (SQLSTATE), о которой необходимо сообщить, либо по имени условия , как показано в Приложение 8.1, либо непосредственно в виде пятисимвольного кода SQLSTATE.
COLUMNCONSTRAINTDATATYPETABLESCHEMA #Позволяет указать имя связанного объекта.
Данный пример прерывает транзакцию с выводом заданного сообщения об ошибке и подсказки:
RAISE EXCEPTION 'Nonexistent ID --> %', user_id
USING HINT = 'Please check your user ID';
В этих двух примерах показаны эквивалентные способы задания кода SQLSTATE:
RAISE 'Duplicate user ID: %', user_id USING ERRCODE = 'unique_violation'; RAISE 'Duplicate user ID: %', user_id USING ERRCODE = '23505';
Существует второй RAISE синтаксис, в котором основным аргументом является имя условия или код SQLSTATE, о котором требуется сообщить, например:
RAISE division_by_zero; RAISE SQLSTATE '22012';
В данном синтаксисе USING можно использовать для вывода произвольного сообщения об ошибке, подробностей (detail) или подсказки (hint). Предыдущий пример можно также реализовать следующим образом:
RAISE unique_violation USING MESSAGE = 'Duplicate user ID: ' || user_id;
Еще один вариант записи — использовать RAISE USING или RAISE
и указать
все остальное в списке level USINGUSING список.
Последний вариант команды RAISE не имеет параметров вовсе.
Эта форма может применяться только внутри BEGIN блока
EXCEPTION конструкция;
она вызывает повторную генерацию текущей обрабатываемой ошибки.
До версии Digital Q.DataBase 9.1, RAISE без
параметров интерпретировалась как повторная генерация ошибки из блока,
содержащего активный обработчик исключений. Таким образом, EXCEPTION
конструкция, вложенная в данный обработчик, не могла перехватить её, даже если
RAISE находилась внутри вложенного EXCEPTION блока
конструкции. Такое поведение считалось неочевидным, а также несовместимым с Oracle PL/SQL.
Если в команде
RAISE EXCEPTION не указано ни имя условия, ни SQLSTATE, по умолчанию используется
raise_exception (P0001). Если текст сообщения не указан, по умолчанию в качестве текста сообщения используется имя условия или SQLSTATE.
При указании кода ошибки через SQLSTATE можно использовать не только предопределенные коды, но и выбирать любой код, состоящий из пяти цифр и/или заглавных латинских букв (ASCII), отличный от 00000. Рекомендуется избегать использования кодов ошибок, заканчивающихся тремя нулями, так как они являются кодами категорий и могут быть перехвачены только путем перехвата всей категории.
Синтаксис ASSERT оператор является удобным сокращенным способом вставки отладочных проверок в PL/pgSQL
функции.
ASSERTcondition[ ,сообщение];
Параметр condition представляет собой логическое выражение, которое всегда должно возвращать значение true; если это условие соблюдается, то ASSERT оператор больше ничего не выполняет. Если результат ложен (false) или равен null, то генерируется ASSERT_FAILURE генерируется исключение. (Если при вычислении condition, она регистрируется как обычная ошибка.)
Если указан необязательный параметр сообщение , то он представляет собой выражение, результат которого (если он не равен null) заменяет стандартный текст сообщения об ошибке «утверждение не выполнено», должен ли condition не выполнится.
Выражение сообщение выражение не вычисляется в обычном случае, когда утверждение выполняется успешно.
Проверку утверждений можно включить или отключить с помощью параметра конфигурации plpgsql.check_asserts, который принимает логическое значение; значение по умолчанию — on. Если для данного параметра
установлено значение off то ASSERT операторы не выполняют никаких действий.
Следует отметить, что ASSERT предназначено для обнаружения программных ошибок, а не для сообщения об обычных ошибочных ситуациях. Для этой цели следует использовать RAISE оператор, описанный выше.