zoukankan      html  css  js  c++  java
  • MySQL定义异常和异常处理方法

    在MySQL中。特定异常须要特定处理。这些异常可以联系到错误,以及子程序中的一般流程控制。定义异常是事先定义程序运行过程中遇到的问题,异常处理定义了在遇到问题时相应当採取的处理方式。而且保证存储过程或者函数在遇到错误时或者警告时可以继续运行。


    1 异常定义

    1.1 语法

    DECLARE condition_name CONDITION FOR [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

    DECLARE command_not_allowed CONDITION FOR SQLSTATE '42000';

    //方法二:使用mysql_error_code

    DECLARE command_not_allowed CONDITION FOR 1148;


    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"信息

    DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info='NO_SUCH_TABLE';


    //方法二:捕获mysql_error_code异常

    //这样的方法是捕获mysql_error_code值。假设遇到mysql_error_code值为1146,运行CONTINUE操作,并输出"NO_SUCH_TABLE"信息;

    DECLARE CONTINUE HANDLER FOR 1146 SET @info='NO_SUCH_TABLE';


    //方法三:先定义条件,然后捕获异常

    DECLARE no_such_table CONDITION FOR 1146;

    DECLARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info='NO_SUCH_TABLE';


    //方法四:使用SQLWARNING捕获异常

    DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR';


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

    DECLARE EXIT HANDLER FOR NOT FOUND SET @info='NO_SUCH_TABLE';


    //方法六:使用SQLEXCEPTION捕获异常

    DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';


    3 综合演示样例

    创建一个表,设置该表的主键,在不定义异常处理和定义异常处理情况下看运行到哪一步。

    show databases;
    use wms;
    create table location
    (
    location_id int primary key,
    location_name varchar(50)
    );

    演示样例1:不定义异常情况下

    DELIMITER //
    CREATE PROCEDURE handlerInsertNoException()
    BEGIN
    	/*DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2=1;*/
    	SET @x=1;
    	INSERT INTO location VALUES (1,'Beijing');
    	SET @x=2;
    	INSERT INTO location VALUES (1,'Wuxi');
    	SET @x=3;
    END;
    //
    DELIMITER ;
    
    调用存储过程与结果:

    mysql> call handlerInsertNoException();
    ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
    mysql> select @x;
    +------+
    | @x   |
    +------+
    |    2 |
    +------+
    1 row in set (0.00 sec)
    
    mysql> select * from location;
    +-------------+---------------+
    | location_id | location_name |
    +-------------+---------------+
    |           1 | Beijing       |
    +-------------+---------------+
    1 row in set (0.00 sec)
    
    
     

    注意:操作演示样例2前要清空表中数据。并退出又一次登录,以免client变量@x影响,具体说明參见结论中的第一点。

    mysql> truncate table location;
    Query OK, 0 rows affected (0.04 sec)
    mysql> select * from location;
    Empty set (0.00 sec)
    mysql> exit;
    Bye
    
    david@Louis:~$ mysql -u root -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 53
    Server version: 5.5.38-0ubuntu0.14.04.1 (Ubuntu)
    
    mysql> use wms;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> select * from location;
    Empty set (0.00 sec)
    
    mysql> select @x;
    +------+
    | @x   |
    +------+
    | NULL |
    +------+
    1 row in set (0.00 sec)
    
    


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

    DELIMITER //
    CREATE PROCEDURE handlerInsertWithException()
    BEGIN
    	DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2=1;
    	SET @x=1;
    	INSERT INTO location VALUES (1,'Beijing');
    	SET @x=2;
    	INSERT INTO location VALUES (1,'Wuxi');
    	SET @x=3;
    END;
    //
    DELIMITER ;

    调用存储过程与结果:

    mysql> CALL handlerInsertWithException();
    Query OK, 0 rows affected (0.09 sec)
    
    mysql> select @x;
    +------+
    | @x   |
    +------+
    |    3 |
    +------+
    1 row in set (0.00 sec)
    

    说明与结论:

    一、MySQL中。@var_name表示用户变量,使用SET语句为其赋值,用户变量与连接有关,一个client定义的变量不能被其它client看到或者使用。当client退出时。该client连接的全部变量将自己主动释放。

    二、在演示样例1中,因为凝视了异常的声明"",此时向表中插入同样主键。就会触发异常。而且採取默认(EXIT)路径。且查看此时的@x返回2,表示以下的INSERT语句并没有运行就退出了.

    三、定义了异常处理,此时遇到错误也会依照异常定义那样继续运行;但仅仅有第一条数据被插入到表中,此时用户变量@x=3说明已经运行到了结尾;


    -----------------------------------------------------------------------------------------------------------------------------

    假设您们在尝试的过程中遇到什么问题或者我的代码有错误的地方。请给予指正,很感谢!

    联系方式:david.louis.tian@outlook.com

    版权@:转载请标明出处!


  • 相关阅读:
    数的划分终极版--背包法解决各类数的划分
    128.最长公共子序列
    整数划分类型题目--专练
    主函数
    LED类代码
    APM2.8地面站下载地址
    多文件函数调用
    流水灯
    APM的3DR无线数传的安装和调试
    闪烁的LED灯
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6732184.html
Copyright © 2011-2022 走看看