Use the 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 ;
The level option specifies
the error severity. Allowed levels are DEBUG,
LOG, INFO,
NOTICE, WARNING,
and EXCEPTION, with EXCEPTION
being the default.
EXCEPTION raises an error (which normally aborts the
current transaction); the other levels only generate messages of different
priority levels.
Whether messages of a particular priority are reported to the client,
written to the server log, or both is controlled by the
log_min_messages and
client_min_messages configuration
variables. See Глава 19 for more
information.
In the first syntax variant,
after the level if any,
write a format string
(which must be a simple string literal, not an expression). The
format string specifies the error message text to be reported.
The format string can be followed
by optional argument expressions to be inserted into the message.
Inside the format string, % is replaced by the
string representation of the next optional argument's value. Write
%% to emit a literal %.
The number of arguments must match the number of %
placeholders in the format string, or an error is raised during
the compilation of the function.
В следующем примере символ % будет заменён на значение v_job_id:
RAISE NOTICE 'Вызов функции cs_create_job(%)', v_job_id;
In the second and third syntax variants,
condition_name and
sqlstate specify an
error condition name or a five-character SQLSTATE code, respectively.
See Приложение A for the valid error condition
names and the predefined SQLSTATE codes.
Here are examples
of condition_name
and sqlstate usage:
RAISE division_by_zero; RAISE WARNING SQLSTATE '22012';
In any of these syntax variants,
you can attach additional information to the error report by writing
USING followed by option = expression items. Each
expression can be any
string-valued expression. The allowed option key words are:
MESSAGE #Sets the error message text. This option can't be used in the first syntax variant, since the message is already supplied.
DETAIL #Предоставляет детальное сообщение об ошибке.
HINT #Предоставляет подсказку по вызванной ошибке.
ERRCODE #Specifies the error code (SQLSTATE) to report, either by condition name, as shown in Приложение A, or directly as a five-character SQLSTATE code. This option can't be used in the second or third syntax variant, since the error code is already supplied.
COLUMNCONSTRAINTDATATYPETABLESCHEMA #Предоставляет имя соответствующего объекта, связанного с ошибкой.
Этот пример прерывает транзакцию и устанавливает сообщение об ошибке с подсказкой:
RAISE EXCEPTION 'Несуществующий ID --> %', user_id
USING HINT = 'Проверьте ваш пользовательский ID';These two examples show equivalent ways of setting the SQLSTATE:
RAISE 'Duplicate user ID: %', user_id USING ERRCODE = 'unique_violation'; RAISE 'Duplicate user ID: %', user_id USING ERRCODE = '23505';
Another way to produce the same result is:
RAISE unique_violation USING MESSAGE = 'ID пользователя уже существует: ' || user_id;
As shown in the fourth syntax variant, it is also possible to
write RAISE USING or RAISE
and put
everything else into the level USINGUSING list.
И заключительный вариант, в котором RAISE не имеет параметров вообще. Эта форма может использоваться только в секции EXCEPTION блока и предназначена для того, чтобы повторно вызвать ошибку, которая сейчас перехвачена и обрабатывается.
До версии PostgreSQL 9.1 команда RAISE без параметров всегда вызывала ошибку с выходом из блока, содержащего активную секцию EXCEPTION. Эту ошибку нельзя было перехватить, даже если RAISE в секции EXCEPTION поместить во вложенный блок со своей секцией EXCEPTION. Это было сочтено удивительным и не совместимым с Oracle PL/SQL.
Если в команде RAISE EXCEPTION не задано ни имя, ни код SQLSTATE, по умолчанию выдаётся raise_exception (P0001). Если не задан текст сообщения, по умолчанию в качестве этого текста передаётся имя условия или код SQLSTATE.
При задании SQLSTATE кода необязательно использовать только список предопределённых кодов ошибок. В качестве кода ошибки может быть любое пятисимвольное значение, состоящее из цифр и/или ASCII символов в верхнем регистре, кроме 00000. Не рекомендуется использовать коды ошибок, которые заканчиваются на 000, потому что так обозначаются коды категорий. И чтобы их перехватить, нужно перехватывать целую категорию.
Оператор ASSERT представляет удобное средство вставлять отладочные проверки в функции PL/pgSQL.
ASSERTусловие[ ,сообщение];
Здесь условие — это логическое выражение, которое, как ожидается, должно быть всегда истинным; если это так, оператор ASSERT больше ничего не делает. Если же оно возвращает ложь или NULL, этот оператор выдаёт исключение ASSERT_FAILURE. (Если ошибка происходит при вычислении условия, она выдаётся как обычная ошибка.)
Если в нём задаётся необязательное сообщение, результат этого выражения (если он не NULL) заменяет сообщение об ошибке по умолчанию «assertion failed» (нарушение истинности), в случае, если условие не выполняется. В обычном случае, когда условие утверждения выполняется, выражение сообщения не вычисляется.
Проверку утверждений можно включить или отключить с помощью конфигурационного параметра plpgsql.check_asserts, принимающего логическое значение; по умолчанию она включена (on). Если этот параметр отключён (off), операторы ASSERT ничего не делают.
Учтите, что оператор ASSERT предназначен для выявления программных дефектов, а не для вывода обычных ошибок (для этого используется оператор RAISE, описанный выше).