mysql异常
定义
mysql中,可以根据需要,自己定义异常,语法如下:
DECLARE condition_name CONDITION
FOR condition_value [, condition_value] ... ;
-- condition_name:是自己起的名字,最好见名知意。
-- condition_value:可以是:
-- sqlstate_value:长度为5的字符串错误代码。
-- mysql_error_value:数值类型的错误代码。
处理
mysql中,用于处理指定异常的handler语法如下:
DECLARE handler_type HANDLER
FOR condition_value [,condition_value] ...
sp_statement;
-- handler_type:有三个取值
-- CONTINUE:遇到错误不进行处理,跳过错误继续执行之后的代码。
-- EXIT:遇到错误时马上退出handler所在的begin end区块,不再执行之后的操作。
-- UNDO:遇到错误后撤回之前已经执行的操作,MySQL暂不支持该操作。
-- condition_value:错误名称,可以包含多个,有以下6种取值:
-- condition_name:定义异常时取的名字
-- mysql_error_value:数值类型的错误代码
-- sqlstate_value:长度为5的字符串错误代码。
-- QLWARNING:代表所有01开头的SQLSTATE代码
-- NOT FOUND:代表所有01开头的SQLSTATE代码
-- SQLEXCEPTION:代表除SQLWARNING和NOT FOUND之外的SQLSTATE代码
-- sp_statement:异常之后的处理。
异常处理的例子:
-- 在FETCH语句获取不到记录的时候(游标对应的结果集已经被遍历一遍,游标不指向任何记录时),
-- 如果声明如下语句,服务器就会执行对应的可执行语句(可执行语句可以用来结束循环)
CREATE PROCEDURE cursor_demo()
BEGIN
-- 声明变量
DECLARE m_value INT;
DECLARE n_value CHAR(1);
DECLARE not_done INT DEFAULT 1;
-- 声明游标
DECLARE t1_record_cursor CURSOR FOR SELECT m1, n1 FROM t1;
-- 在游标遍历完记录的时候将变量 not_done 的值设置为 0,并且不再执行后边的语句
DECLARE EXIT HANDLER FOR NOT FOUND SET not_done = 0;
-- 使用游标遍历
OPEN t1_record_cursor;
WHILE not_done = 1 DO
FETCH t1_record_cursor INTO m_value, n_value;
SELECT m_value, n_value, not_done;
END WHILE;
CLOSE t1_record_cursor;
END
异常代码和信息
mysql中自带
的异常代码和信息有两种表示方式:mysql_error_code和SQLSTATE [VALUE] sqlstate_value。
mysql_error_code
一个4位数字,mysql自己定义的错误代码,参见链接。
SQLSTATE [VALUE] sqlstate_value
5个字符组成的字符串,同mysql_error_code一一对应,从ANSI SQL和ODBC这些标准中引用过来的,因此更加标准化,而不像上面的error_code完全是mysql自己定义给自己用的。
参考文献
https://blog.youkuaiyun.com/weixin_37839711/article/details/81506723 Mysql的异常处理
https://www.cnblogs.com/aixinyiji/p/11038635.html Mysql中的异常处理