您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

DECLARE EXIT HANDLER

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;

通过设置 = 0,过程执行的结果将为:

::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 内。允许显式使用 COMMITROLLBACK。 备注现在可以使用错误代码 146 为语句 FOR UPDATE NOWAIT 定义出口处理程序。有关详细信息,请参阅支持的错误代码。

除使用错误代码外,还可以为条件定义退出处理程序。

DECLARE EXIT HANDLER FOR MY_COND

SELECT ::SQL_ERROR_CODE, ::SQL_ERROR_MESSAGE FROM DUMMY;

有关声明条件的详细信息,请参见 DECLARE CONDITION。

如果要在退出处理程序中执行更多操作,必须通过 BEGINEND 使用块。例如,准备一些附加信息并将错误插入表中:

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 中的新行也将消失。为避免这种情况,您可以使用自主事务。有关详细信息,请参阅自主事务。