DECLARE EXIT HANDLER 参数允许您定义出口处理程序来处理过程或函数中的异常条件。
DECLARE EXIT HANDLER FOR {,}...]
::= SQLEXCEPTION
| SQL_ERROR_CODE
|
例如,以下退出处理程序捕获所有 SQLEXCEPTION 并返回抛出异常的信息:
DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT 'EXCEPTION was thrown' AS ERROR FROM dummy;有两个系统变量 ::SQL_ERROR_CODE 和 ::SQL_ERROR_MESSAGE 可用于获取错误代码和错误消息,如下一示例所示:
CREATE PROCEDURE MYPROC (IN in_var INTEGER, OUT outtab TABLE(I INTEGER) ) AS
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
SELECT ::SQL_ERROR_CODE, ::SQL_ERROR_MESSAGE FROM DUMMY;
outtab = SELECT 1/:in_var as I FROM dummy;
END;
通过设置
::SQL_ERROR_CODE::SQL_ERROR_MESSAGE304未定义除数为零:除法的右侧值不能在函数 /() 处为零(请检查行:6)
除了为任意 SQLEXCEPTION 定义退出处理程序外,还可以使用关键字 SQL_ERROR_CODE 后跟 SQL 错误代码编号为特定错误代码编号定义退出处理程序。
例如,如果只处理错误“除数为零”的异常处理程序,则代码如下所示:
DECLARE EXIT HANDLER FOR SQL_ERROR_CODE 304
SELECT ::SQL_ERROR_CODE, ::SQL_ERROR_MESSAGE FROM DUMMY;
出口处理程序中支持以下错误代码。您可以使用系统视图 M_ERROR_CODES 获取有关错误代码的详细信息。 类型描述SQL 错误代码以 ERR_SQL_* 开头的代码字符串SQLScript 错误代码以 ERR_SQLSCRIPT_* 开头的代码字符串事务错误代码ERR_TX_ROLLBACK_LOCK_TIMEOUTERR_TX_ROLLBACK_DEADLOCKERR_TX_SERIALIZATIONERR_TX_LOCK_ACQUISITION_FAIL用户错误代码用户错误代码 捕获事务错误时,事务仍位于 EXIT HANDLER 内。允许显式使用 COMMIT 或 ROLLBACK。 备注现在可以使用错误代码 146 为语句 FOR UPDATE NOWAIT 定义出口处理程序。有关详细信息,请参阅支持的错误代码。
除使用错误代码外,还可以为条件定义退出处理程序。
DECLARE EXIT HANDLER FOR MY_COND
SELECT ::SQL_ERROR_CODE, ::SQL_ERROR_MESSAGE FROM DUMMY;
有关声明条件的详细信息,请参见 DECLARE CONDITION。
如果要在退出处理程序中执行更多操作,必须通过 BEGIN…END 使用块。例如,准备一些附加信息并将错误插入表中:
DECLARE EXIT HANDLER FOR SQL_ERROR_CODE 304
BEGIN
DECLARE procedure_name NVARCHAR(500) =
::CURRENT_OBJECT_SCHEMA || '.' ||::CURRENT_OBJECT_NAME;
DECLARE parameters NVARCHAR(255) =
'IN_VAR = '||:in_var;
INSERT INTO LOG_TABLE VALUES ( ::SQL_ERROR_CODE,
::SQL_ERROR_MESSAGE,
:procedure_name,
:parameters );
END;
tab = SELECT 1/:in_var as I FROM dummy;
备注在上面的示例中,如果出现未处理的异常,事务将回退。因此,表 LOG_TABLE 中的新行也将消失。为避免这种情况,您可以使用自主事务。有关详细信息,请参阅自主事务。