WHEN … DO
Обработка ошибок.
PSQL
WHEN {<error> [, <error> ...] | ANY} DO <compound_statement> <error> ::= { EXCEPTION exception_name | SQLCODE number | GDSCODE errcode | SQLSTATE 'sqlstate_code' }
Параметр | Описание |
---|---|
exception_name |
Имя исключения. |
number |
Код ошибки SQLCODE. |
errcode |
Символическое имя ошибки GDSCODE. |
sqlstate_code |
Код ошибки SQLSTATE. |
compound_statement |
Оператор или блок операторов. |
Оператор WHEN … DO
используется для обработки ошибочных ситуаций и пользовательских исключений.Оператор перехватывает все ошибки и пользовательские исключения, перечисленные после ключевого слова WHEN
.Если после ключевого слова WHEN
указано ключевое слово ANY
, то оператор перехватывает любые ошибки и пользовательские исключения, даже если они уже были обработаны в вышестоящем WHEN
блоке.
Оператор WHEN … DO
должен находиться в самом конце блока операторов перед оператором END
.
После ключевого слова DO
следует составной оператор, в котором можно произвести обработку ошибки или исключения.Составной оператор — это оператор или блок операторов, заключённый в операторные скобки BEGIN
и END
.В этом операторе доступны контекстные переменные GDSCODE, SQLCODE, SQLSTATE.Для получения имени активного пользовательского исключения или текста интерпретированного сообщения об ошибке вы можете воспользоваться системной функцией RDB$ERROR.В этом же блоке доступен оператор повторного вызова ошибки или исключительной ситуации EXCEPTION
(без параметров).
Important
|
После предложения |
Оператор WHEN … DO
вызывается только в том случае, если произошло одно из указанных в его условии событий.В случае выполнения оператора (даже если в нем фактически не было выполнено никаких действий) ошибка или пользовательское исключение не прерывает и не отменяет действий триггера или хранимой процедуры, где был выдан этот оператор, работа продолжается, как если бы никаких исключительных ситуаций не было.Однако в этом случае будет отменено действие DML оператора (SELECT
, INSERT
, UPDATE
, DELETE
, MERGE
), который вызвал ошибку и все ниже находящиеся операторы в том же блоке операторов не будут выполнены.
Important
|
Если ошибка вызвана не одним из DML операторов ( |