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

DECLARE CONTINUE HANDLER

描述

SQLScript 中的 EXIT 处理器已经提供了在执行期间处理过程或函数中的异常条件的方法。CONTINUE 处理器不仅允许您处理错误,还允许您在抛出异常后继续执行。 注意CONTINUE HANDLER 内不支持触发器。

语法

代码语法DECLARE CONTINUE HANDLER FOR {,}...] ::= SQLEXCEPTION | SQL_ERROR_CODE |

行为

用于捕获和处理异常的 CONTINUE 处理器的行为与具有以下异常和扩展的 EXIT 处理器的行为相同。

处理后继续

在捕获并处理异常后,SQLScript 将继续执行抛出异常的语句之后的语句。

示例代码DO BEGIN DECLARE A INT = 10; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN -- Catch the exception SELECT ::SQL_ERROR_CODE, ::SQL_ERROR_MESSAGE FROM DUMMY; END; A = 1 / 0; -- An exception will be thrown SELECT :A FROM DUMMY; -- Continue from this statement after handling the exceptionEND;

在多层块中,SQLScript 将继续执行最内层块中抛出异常语句之后的下一个语句。

示例代码DO BEGIN DECLARE A INT = 10; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SELECT ::SQL_ERROR_CODE, ::SQL_ERROR_MESSAGE FROM DUMMY; -- Catch the exception SELECT :A FROM DUMMY; BEGIN A = 1 / 0; -- An exception throwing A = :A + 1; -- Continue from this statement after handling the exception END; SELECT :A FROM DUMMY; -- Result: 11END;

冻结并行执行

在并行执行块中,很难确定哪个语句是抛出错误的语句之后的语句。某些语句可能已在发生异常之前执行。

因此,继续处理程序范围内不支持隐式或显式并行执行。

示例代码CREATE PROCEDURE PROC READS SQL DATA AS BEGIN SELECT * FROM DUMMY;END; DO BEGIN DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SELECT ::SQL_ERROR_CODE, ::SQL_ERROR_MESSAGE FROM DUMMY; -- Catch the exception BEGIN PARALLEL EXECUTION -- not supported CALL PROC; CALL PROC; CALL PROC; END;END;

处理条件语句

如果 IFWHILEFOR 块的条件语句中存在错误,则处理错误后将跳过整个块,因为该条件不再有效。

示例代码DO BEGIN DECLARE A INT = 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SELECT ::SQL_ERROR_CODE, ::SQL_ERROR_MESSAGE FROM DUMMY; IF A = 1 / 0 THEN -- An error occurs A = 1; ELSE A = 2; END IF; SELECT :A FROM DUMMY; -- Continue from here, Result: 0END;

退出处理器并继续处理器

EXIT 处理器不能在相同范围内或在 CONTINUE 处理器的嵌套范围内声明,但可以在 EXIT 处理器的嵌套范围内声明 CONTINUE 处理器。

示例代码DO BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT ::SQL_ERROR_CODE, ::SQL_ERROR_MESSAGE FROM DUMMY; -- OK BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT ::SQL_ERROR_CODE, ::SQL_ERROR_MESSAGE FROM DUMMY; -- Checker error thrown DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SELECT ::SQL_ERROR_CODE, ::SQL_ERROR_MESSAGE FROM DUMMY; BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT ::SQL_ERROR_CODE, ::SQL_ERROR_MESSAGE FROM DUMMY; -- Checker error thrown SELECT 1 / 0 FROM DUMMY; END; END;END;

变量值

在执行返回异常的语句之前,变量的值保持不变。

示例代码CREATE TABLE TAB (I INT);DO BEGIN DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; INSERT INTO TAB VALUES (1); INSERT INTO TAB VALUES (1 / 0); -- An error thrown SELECT ::ROWCOUNT FROM DUMMY; -- 1, not 0END; DO BEGIN DECLARE CONTINUE HANDLER FOR SQL_ERROR_CODE 12346 BEGIN END; BEGIN DECLARE CONTINUE HANDLER FOR SQL_ERROR_CODE 12345 BEGIN SIGNAL SQL_ERROR_CODE 12346; SELECT ::SQL_ERROR_CODE FROM DUMMY; -- 12346, not 12345 END; SIGNAL SQL_ERROR_CODE 12345; END;END; DO BEGIN DECLARE A INT = 10; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN SELECT :A FROM DUMMY; -- Result: 10 END; A = 1 / 0; SELECT :A FROM DUMMY; -- Result: 10END;