MySQL/MariaDB存储过程的运行和错误捕获

MySQL/MariaDB存储过程带返回参数的运行和错误捕获

一、存储过程定义

定义了如下内容的存储过程,用于简单示例错误捕获的写法:

CREATE DEFINER=`root`@`localhost` PROCEDURE `updateScore`(
	IN `uid` INT,
	IN `setScore` FLOAT,
	OUT `setOk` TINYINT
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
	
	DECLARE hasError tinyINT DEFAULT 0;
	DECLARE CONTINUE handler FOR SQLEXCEPTION,NOT FOUND,SQLWARNING SET hasError=1; 
	START transaction;

	UPDATE users SET UserScores =setScore WHERE UserId=uid;
	/*	SELECT userid INTO setok FROM users WHERE UserId=uid;*/
	IF hasError THEN
		ROLLBACK;
	ELSE
		COMMIT;
	END IF;
	SET setOk = hasError;

END

其中:
(1)setOk参数为OUT,会返回该值,运行时前面要用@符合
(2)下述语句用于定义执行SQL语句时的错误捕获:

	DECLARE hasError tinyINT DEFAULT 0;
	DECLARE CONTINUE handler FOR SQLEXCEPTION,NOT FOUND,SQLWARNING SET hasError=1; 

注意:NOT FOUND代表以’02’开头的SQLSTATE,仅仅对select语句和游标有效!
因此,上面的存储过程中,update不存在的UserId时,并不会产生NOT FOUND捕获,如果需要判断是否存在UserId,需要用select语句或者update后调用ROW_COUNT()检查语句影响的记录数!

DECLARE的具体语法是:

DECLARE handler_type HANDLER
    FOR condition_value [, condition_value] ...
    statement

handler_type:
    CONTINUE
  | EXIT 
  | UNDO

condition_value:
    SQLSTATE [VALUE] sqlstate_value
  | condition_name
  | SQLWARNING
  | NOT FOUND
  | SQLEXCEPTION
  | mariadb_error_code

详细语法说明可参考:
https://mariadb.com/kb/zh-cn/declare-handler/

二、运行存储过程

在SQL查询窗口中运行该存储过程。
例如将UserId=3的分数改为98,采用如下语句:

CALL `updateScore`(3,98, @hasErrors);
SELECT @hasErrors;

运行的返回结果如下:
在这里插入图片描述

这里:不论是否真正发生替换(影响到的具体记录数是否>0),都会返回0,要检查发生替换的记录数,要用ROW_COUNT()返回值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值