SQLScript 中的 EXIT 处理器已经提供了在执行期间处理过程或函数中的异常条件的方法。CONTINUE 处理器不仅允许您处理错误,还允许您在抛出异常后继续执行。 注意CONTINUE HANDLER 内不支持触发器。
代码语法DECLARE CONTINUE HANDLER FOR
用于捕获和处理异常的 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;
如果 IF、WHILE 或 FOR 块的条件语句中存在错误,则处理错误后将跳过整个块,因为该条件不再有效。
示例代码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;