MySQL定义异常和异常处理详解
在MySQL中,特定异常需要特定处理。这些异常可以联系到错误,以及子程序中的一般流程控制。定义异常是事先定义程序执行过程中遇到的问题,异常处理定义了在遇到问题时对应当采取的处理方式,并且保证存储过程或者函数在遇到错误时或者警告时能够继续执行。
1异常定义
1.1语法
DECLAREcondition_nameCONDITIONFOR[condition_type];
1.2说明
condition_name参数表示异常的名称;
condition_type参数表示条件的类型,condition_type由SQLSTATE[VALUE]sqlstate_value|mysql_error_code组成:
sqlstate_value和mysql_error_code都可以表示MySQL的错误;
sqlstate_value为长度为5的字符串类型的错误代码;
mysql_error_code为数值类型错误代码;
1.3示例
定义“ERROR1148(42000)”错误,名称为command_not_allowed。可以有以下两种方法:
//方法一:使用sqlstate_value DECLAREcommand_not_allowedCONDITIONFORSQLSTATE'42000′; //方法二:使用mysql_error_code DECLAREcommand_not_allowedCONDITIONFOR1148;
2自定义异常处理
2.1异常处理语法
DECLAREhandler_typeHANDLERFORcondition_value[,...]sp_statement
2.2参数说明
handler_type:CONTINUE|EXIT|UNDO
handler_type为错误处理方式,参数为3个值之一;
CONTINUE表示遇到错误不处理,继续执行;
EXIT表示遇到错误时马上退出;
UNDO表示遇到错误后撤回之前的操作,MySQL暂不支持回滚操作;
condition_value:SQLSTATE[VALUE]sqlstate_value|condition_name|SQLWARNING|NOTFOUND|SQLEXCEPTION|mysql_error_code
condition_value表示错误类型;
SQLSTATE[VALUE]sqlstate_value为包含5个字符的字符串错误值;
condition_name表示DECLARECONDITION定义的错误条件名称;
SQLWARNING匹配所有以01开头的SQLSTATE错误代码;
NOTFOUND匹配所有以02开头的SQLSTATE错误代码;
SQLEXCEPTION匹配所有没有被SQLWARNING或NOTFOUND捕获的SQLSTATE错误代码;
mysql_error_code匹配数值类型错误代码;
2.3异常捕获方法
//方法一:捕获sqlstate_value异常 //这种方法是捕获sqlstate_value值。如果遇到sqlstate_value值为”42S02″,执行CONTINUE操作,并输出”NO_SUCH_TABLE”信息 DECLARECONTINUEHANDLERFORSQLSTATE'42S02′SET@info='NO_SUCH_TABLE'; //方法二:捕获mysql_error_code异常 //这种方法是捕获mysql_error_code值。如果遇到mysql_error_code值为1146,执行CONTINUE操作,并输出”NO_SUCH_TABLE”信息; DECLARECONTINUEHANDLERFOR1146SET@info='NO_SUCH_TABLE'; //方法三:先定义条件,然后捕获异常 DECLAREno_such_tableCONDITIONFOR1146; DECLARECONTINUEHANDLERFORNO_SUCH_TABLESET@info='NO_SUCH_TABLE'; //方法四:使用SQLWARNING捕获异常 DECLAREEXITHANDLERFORSQLWARNINGSET@info='ERROR'; //方法五:使用NOTFOUND捕获异常 DECLAREEXITHANDLERFORNOTFOUNDSET@info='NO_SUCH_TABLE'; //方法六:使用SQLEXCEPTION捕获异常 DECLAREEXITHANDLERFORSQLEXCEPTIONSET@info='ERROR';
3综合示例
创建一个表,设置该表的主键,在不定义异常处理和定义异常处理情况下看执行到哪一步。
showdatabases; usewms; createtablelocation ( location_idintprimarykey, location_namevarchar(50) );
示例1:不定义异常情况下
DELIMITER// CREATEPROCEDUREhandlerInsertNoException() BEGIN /*DECLARECONTINUEHANDLERFORSQLSTATE'23000'SET@x2=1;*/ SET@x=1; INSERTINTOlocationVALUES(1,'Beijing'); SET@x=2; INSERTINTOlocationVALUES(1,'Wuxi'); SET@x=3; END; // DELIMITER;
调用存储过程与结果:
mysql>callhandlerInsertNoException(); ERROR1062(23000):Duplicateentry'1'forkey'PRIMARY' mysql>select@x; +------+ |@x| +------+ |2| +------+ 1rowinset(0.00sec) mysql>select*fromlocation; +-------------+---------------+ |location_id|location_name| +-------------+---------------+ |1|Beijing| +-------------+---------------+ 1rowinset(0.00sec)
注意:操作示例2前要清空表中数据,并退出重新登录,以免客户端变量@x影响,详细说明参见结论中的第一点。
mysql>truncatetablelocation; QueryOK,0rowsaffected(0.04sec) mysql>select*fromlocation; Emptyset(0.00sec) mysql>exit; Bye david@Louis:~$mysql-uroot-p Enterpassword: WelcometotheMySQLmonitor.Commandsendwith;or\g. YourMySQLconnectionidis53 Serverversion:5.5.38-0ubuntu0.14.04.1(Ubuntu) mysql>usewms; Readingtableinformationforcompletionoftableandcolumnnames Youcanturnoffthisfeaturetogetaquickerstartupwith-A Databasechanged mysql>select*fromlocation; Emptyset(0.00sec) mysql>select@x; +------+ |@x| +------+ |NULL| +------+ 1rowinset(0.00sec)
示例2:定义异常处理情况下:
DELIMITER// CREATEPROCEDUREhandlerInsertWithException() BEGIN DECLARECONTINUEHANDLERFORSQLSTATE'23000'SET@x2=1; SET@x=1; INSERTINTOlocationVALUES(1,'Beijing'); SET@x=2; INSERTINTOlocationVALUES(1,'Wuxi'); SET@x=3; END; // DELIMITER;
调用存储过程与结果:
mysql>CALLhandlerInsertWithException(); QueryOK,0rowsaffected(0.09sec) mysql>select@x; +------+ |@x| +------+ |3| +------+ 1rowinset(0.00sec)
说明与结论:
一、MySQL中,@var_name表示用户变量,使用SET语句为其赋值,用户变量与连接有关,一个客户端定义的变量不能被其他客户端看到或者使用。当客户端退出时,该客户端连接的所有变量将自动释放。
二、在示例1中,由于注释了异常的声明”",此时向表中插入相同主键,就会触发异常,并且采取默认(EXIT)路径;且查看此时的@x返回2,表示下面的INSERT语句并没有执行就退出了.
三、定义了异常处理,此时遇到错误也会按照异常定义那样继续执行;但只有第一条数据被插入到表中,此时用户变量@x=3说明已经执行到了结尾;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。