今天就跟大家聊聊有关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 示例

定义“ERROR 1148(42000)”错误,名称为command_not_allowed。可以有以下两种方法:

方法一:使用sqlstate_value

DECLAREcommand_not_allowedCONDITIONFORSQLSTATE’42000′;

方法二:使用mysql_error_code

DECLAREcommand_not_allowedCONDITIONFOR1148;

2 自定义异常处理

2.1 异常处理语法

DECLARE handler_type HANDLER FOR condition_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|NOT FOUND|SQLEXCEPTION|mysql_error_code

condition_value表示错误类型;

SQLSTATE [VALUE] sqlstate_value为包含5个字符的字符串错误值;

condition_name表示DECLARE CONDITION定义的错误条件名称;

SQLWARNING匹配所有以01开头的SQLSTATE错误代码;

NOT FOUND匹配所有以02开头的SQLSTATE错误代码;

SQLEXCEPTION匹配所有没有被SQLWARNING或NOT FOUND捕获的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’;

方法五:使用NOT FOUND捕获异常

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;Byedavid@Louis:~$mysql-uroot-pEnterpassword:WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMySQLconnectionidis53Serverversion:5.5.38-0ubuntu0.14.04.1(Ubuntu)mysql>usewms;ReadingtableinformationforcompletionoftableandcolumnnamesYoucanturnoffthisfeaturetogetaquickerstartupwith-ADatabasechangedmysql>select*fromlocation;Emptyset(0.00sec)mysql>select@x;+------+|@x|+------+|NULL|+------+1rowinset(0.00sec)

示例2:定义异常处理情况下:

DELIMITER//CREATEPROCEDUREhandlerInsertWithException()BEGINDECLARECONTINUEHANDLERFORSQLSTATE'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说明已经执行到了结尾;

看完上述内容,你们对MySQL中怎么定义和处理异常有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。