CREATE DEFINER=`root`@`%` PROCEDURE `proc_procedurename`(IN `parameter1_IN` varchar(50),IN `parameter2_IN` varchar(50),OUT `result_OUT` varchar(1))
BEGIN
-- 业务参数定义1
-- ...
-- 业务参数定义n
-- 设置判断游标是否执行完成参数
DECLARE done INTEGER DEFAULT FALSE;
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 设置异常处理
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
GET DIAGNOSTICS CONDITION 1
@errno = MYSQL_ERRNO, @errmsg = MESSAGE_TEXT;
-- 事务开始
START TRANSACTION;
-- 业务编写===开始===
-- ...
-- 业务编写===结束===
-- 异常回滚
IF @errno > 0 THEN
-- 返回执行失败信息(0:成功,1:失败)
select '1' into result_OUT from dual;
select concat(@errno,':',@errmsg) result_ERROR;
ROLLBACK;
ELSE
-- 返回执行成功信息(0:成功,1:失败)
select '0' into result_OUT from dual;
-- 提交
COMMIT;
END IF;
END
==================================================================================
说明:
网上很多存储过程都是教大家怎样定义使用,很少涉及到异常的抛出处理,mysql存储过程的异常抛出处理比oracle的要麻烦,oracle的直接判断抛出,而mysql的还要自己手写捕捉,并且MySQL不支持存储过程的调试,不像oracle那样搞个PL/SQL然后断点就可以调试了。
关于mysql错误代码@errno可以参考下面这位仁兄的网址:https://www.cnblogs.com/joeblackzqq/p/4575938.html
本文纯粹是为了记录工作中遇到的问题与经验总结,如果你觉得有用可以直接拿来用,这只是一个存储过程的格式,不涉及业务处理 ,有需要业务处理的同学可以自行添加修改。