U0400017:GaussDB 存储过程异常处理不支持 CONTINUE HANDLER 处理器
描述
数据库类型与版本
- 源库类型与版本:MySQL 5.5、5.6、5.7、8.0版本。
- 目标库类型与版本:GaussDB所有版本。
语法示例
UGO 无法处理 MySQL 的 CONTINUE HANDLER 异常处理器,如果识别到 MySQL 存储过程中使用了 CONTINUE HANDLER,将生成此错误提示。
如下 MySQL 的存储过程,用于向 employees 表中插入员工记录。如果插入的记录已经存在(即违反了唯一键约束),此时将记录一条日志消息,并继续执行存储过程而不是中断退出。GaussDB 存储过程中不支持 continue 类型的异常处理机制,GaussDB 处理完异常将退出程序,因此该场景不支持自动化转换。
CREATE PROCEDURE insert_employee(IN p_first_name VARCHAR(50), IN p_last_name VARCHAR(50), IN p_email VARCHAR(100)) BEGIN DECLARE CONTINUE HANDLER FOR 1062 -- 1062 is the error code for duplicate entry BEGIN INSERT INTO error_log (message) VALUES (CONCAT('Duplicate email: ', p_email)); END; INSERT INTO employees (first_name, last_name, email) VALUES (p_first_name, p_last_name, p_email); END;
改造建议
用户需要修改存储过程逻辑或者通过业务来实现源数据库存储过程的功能。
如上述示例中,异常可能发生处后续并没有其它处理逻辑,也就是说此时 CONTINUE HANDLER 和 EXIT HANDLER 的效果是一致的,这种场景下也可以参考如下示例,将 CONTINUE HANDLER 手改成 GaussDB 的异常处理逻辑(需要注意的是错误码的对应关系需要参考《GaussDB开发者指南》,如下示例中的错误码 1062 并没有进行转换处理)。
CREATE PROCEDURE insert_employee(IN p_first_name VARCHAR(50), IN p_last_name VARCHAR(50), IN p_email VARCHAR(100)) AS BEGIN INSERT INTO employees (first_name, last_name, email) VALUES (p_first_name, p_last_name, p_email); EXCEPTION WHEN 1062 THEN BEGIN INSERT INTO error_log (message) VALUES (CONCAT('Duplicate email: ', p_email)); END; RETURN; END ;
上述手改方案需要您充分评估源存储过程的业务,确保 CONTINUE HANDLER 之后没有业务逻辑需要处理。