如何在存储过程中根据指定查询结果抛出异常并终止执行
存储过程校验逻辑实现方案
需求说明
需要在现有存储过程中增加校验逻辑:当下方校验SQL返回1条及以上记录时,直接抛出异常并终止存储过程运行。
校验用SQL代码:
SELECT NULL FROM table1 WHERE condition GROUP BY column HAVING COUNT(1) > 1 UNION ALL SELECT NULL FROM table1 a WHERE condition AND EXISTS ( SELECT NULL FROM table2 b WHERE condition );
主流数据库实现示例
MySQL 版本
DELIMITER // CREATE PROCEDURE 你的存储过程名称(自定义参数列表) BEGIN DECLARE check_count INT; -- 统计校验SQL返回行数 SELECT COUNT(*) INTO check_count FROM ( SELECT NULL FROM table1 WHERE condition GROUP BY `column` HAVING COUNT(1) > 1 UNION ALL SELECT NULL FROM table1 a WHERE condition AND EXISTS ( SELECT NULL FROM table2 b WHERE condition ) ) AS check_temp; -- 校验不通过抛出异常终止 IF check_count > 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '数据校验不通过,存在不符合规则的记录'; END IF; -- 此处写原有存储过程业务逻辑 -- ...... END // DELIMITER ;
Oracle 版本
CREATE OR REPLACE PROCEDURE 你的存储过程名称(自定义参数列表) AS check_count NUMBER; BEGIN SELECT COUNT(*) INTO check_count FROM ( SELECT NULL FROM table1 WHERE condition GROUP BY column HAVING COUNT(1) > 1 UNION ALL SELECT NULL FROM table1 a WHERE condition AND EXISTS ( SELECT NULL FROM table2 b WHERE condition ) ) check_temp; IF check_count > 0 THEN RAISE_APPLICATION_ERROR(-20001, '数据校验不通过,存在不符合规则的记录'); END IF; -- 此处写原有存储过程业务逻辑 -- ...... END; /
注意事项
- 代码中的
condition、column、存储过程名称、参数列表都需要替换为实际业务对应的内容 - 其他数据库可参考上述逻辑,调整对应异常抛出语法实现即可
内容的提问来源于stack exchange,提问作者banana_99
相关产品推荐
相关产品推荐

