mysql游标遍历中sql语句出现异常_MySQL中的异常处理,游标

一、异常处理的理解

ERROR 1062 (23000): Duplicate entry ‘2’ for key ‘PRIMARY’

错误 4位error code(5位sql statis):错误内容

二、异常处理的重要性

没有异常处理的存储过程,执行过程中非常难以预测执行结果。

建议:存储过程中加上异常处理部分。

三、异常处理的实现

异常处理的格式:

DECLARECONTINUE/EXITHANDLER FORSQLSTATE ‘23000’ (错误代码)

1.错误是什么?

eg:1062(23000)

2.怎么处理错误?

先执行SQL,再执行EXIT/CONTINUE

小结:

针对什么错误,首先执行SQL语句,可以是一个begin..end;语句块;

根据是continue还是exit,确定是接着执行还是退出begin..end;

接着执行的话,就是接着执行出错的SQL的下一条语句;

如果是退出,就退出这个declare所在的begin…end。

例子1:

DELIMITER $$

CREATE PROCEDURE small_mistake1(

OUT error VARCHAR(5))

BEGIN

DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' --》这是个异常

SET error = '23000'; //用来记录错误发生时的一些信息,异常捕获、处理

select error;

SET error = '00000';

select error;

INSERT INTO TEAMS VALUES(2,27,'third');

SET error = '23001';

END$$

DELIMITER ;

执行结果:

mysql> call small_mistake1(@a); --》上来直接就是select error,因为先执行sql

+-------+

| error |

+-------+

| NULL |

+-------+

1 row in set (0.00 sec)

+-------+

| error |

+-------+

| 00000 |

+-------+

1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> select @a; --》

+-------+

| @a |

+-------+

| 23001 |

+-------+

1 row in set (0.00 sec)

===例子2:

CREATE TABLE test.t (s1 INT, PRIMARY KEY (s1));

delimiter $$

CREATE PROCEDURE handlerdemo ()

BEGIN

DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;

SET @x = 1;

INSERT INTO test.t VALUES (1); ---》能执行

SET @x = 2; --》报错,因为@x==1

INSERT INTO test.t VALUES (1);

SET @x = 3;

END$$

delimiter ;

CALL handlerdemo()

执行结果:

mysql> select @x2; --》捕获到异常,就令x2=1

+------+

| @x2 |

+------+

| 1 |

+------+

1 row in set (0.00 sec)

mysql> select @x; --》set @x=3

+------+

| @x |

+------+

| 3 |

+------+

1 row in set (0.00 sec)

===例子3:

DELIMITER $$

CREATE PROCEDURE small_mistake2(

OUT error VARCHAR(5))

BEGIN

DECLARE EXIT HANDLER FOR SQLSTATE '23000' --》EXIT直接退出begin..end

SET error = '23000';

select error;

SET error = '00000';

select error;

INSERT INTO TEAMS VALUES(2,27,'third');

--》此语句出错,捕获到异常后,因为是exit,所以不会再执行下面的set error='23001'语句

SET error = '23001';

END$$

DELIMITER ;

mysql> call small_mistake2(@a); --》先执行sql

+-------+

| error |

+-------+

| NULL |

+-------+

1 row in set (0.00 sec) --》捕获到异常

+-------+

| error |

+-------+

| 00000 |

+-------+

1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> select @a; ---》证明没有执行set error='23001'

+-------+

| @a |

+-------+

| 23000 |

+-------+

1 row in set (0.00 sec)

===例子4:一个begin后面可以接多个DECLARE

DELIMITER $$

CREATE PROCEDURE small_mistake3(

OUT error VARCHAR(5))

BEGIN

DECLARE CONTINUE HANDLER FOR SQLSTATE '23000'

SET error = '23000';

DECLARE CONTINUE HANDLER FOR SQLSTATE '21S01'

SET error = '21S01';

INSERT INTO TEAMS VALUES(2,27,'third',5);

END$$

DELIMITER ;

mysql> call small_mistake3(@error);

Query OK, 0 rows affected (0.00 sec)

mysql> select @error;

+--------+

| @error |

+--------+

| 21S01 |

+--------+

1 row in set (0.00 sec)

四、错误捕获快捷方式

异常处理的好处:

①出错不报错

②出错可以进行处理;记录出错时的一些信息

③处理所有的错误:

===例子1:

DELIMITER $$

CREATE PROCEDURE small_mistake5(

OUT error VARCHAR(5))

BEGIN

DECLARE CONTINUE HANDLER FOR SQLWARNING,NOT FOUND,SQLEXCEPTION

---》错误是1开头的赋给SQLWARNING,2开头的NOT FOUND,其他给SQLEXCEPTION

SET error = 'xxxxx';

INSERT INTO teams VALUES(2,27,'third');

END$$

DELIMITER ;

mysql> call small_mistake5(@a);

Query OK, 0 rows affected (0.00 sec)

mysql> select @a;

+-------+

| @a |

+-------+

| xxxxx |

+-------+

1 row in set (0.00 sec)

===忽略一个错误:

忽略一个条件

DECLARE CONTINUE HANDLER FOR SQLWARNING BEGIN END;

–》碰到1开头的就过。

五、异常处理嵌套问题

例子1:增加程序的可读性。

DELIMITER $$

CREATE PROCEDURE small_mistake6(

OUT error VARCHAR(5))

BEGIN

DECLARE non_unique CONDITION FOR SQLSTATE '23000';

DECLARE CONTINUE HANDLER FOR non_unique

begin

SET error = '23000';

select error;

end;

INSERT INTO TEAMS VALUES(2,27,'third');

END$$

DELIMITER ;

mysql> call small_mistake6(@error);

+-------+

| error |

+-------+

| 23000 |

+-------+

1 row in set (0.01 sec)

例子2:异常处理的嵌套

DELIMITER $$

CREATE PROCEDURE small_mistake7()

BEGIN

DECLARE CONTINUE HANDLER FOR SQLSTATE '23000'

SET @processed = 100;

BEGIN

DECLARE CONTINUE HANDLER FOR SQLSTATE '21000'

SET @processed = 200;

INSERT INTO TEAMS VALUES(2,27,'third');

--》出错,假设能被内层的捕获,就执行200;若不能被内层捕获,内层的begin...end就废了,就执行外层100

END;

END$$

DELIMITER ;

mysql> call small_mistake7;

Query OK, 0 rows affected (0.00 sec)

mysql> select @processed;

+------------+

| @processed |

+------------+

| 100 |

+------------+

1 row in set (0.00 sec)

====小结

当有多层begin…end的时候,最好每层都有自己完善的异常处理。自己异常,自己这层去处理。

六、游标 CURSOR

游标:处理结果集。多行多列

====例子1:

DELIMITER $$

CREATE PROCEDURE number_of_players(

OUT pnumber INTEGER

)

BEGIN

DECLARE a_playerno INTEGER; --》变量1

DECLARE FOUND BOOLEAN DEFAULT TRUE; --》变量2

DECLARE c_players CURSOR FOR --》声明游标(将游标和sql语句关联起来)

SELECT playerno FROM PLAYERS;

DECLARE CONTINUE HANDLER FOR NOT FOUND --》异常处理,所有的以2开头的错误

SET FOUND = FALSE; --》异常处理后FOUND变为false

SET pnumber = 0;

OPEN c_players; --》打开游标(将游标和结果集联系起来)

FETCH c_players INTO a_playerno; --》fetch...into相当于select into

WHILE FOUND DO

SET pnumber = pnumber + 1;

FETCH c_players INTO a_playerno; --》循环中的fetch...into,依次指向结果集的一个

END WHILE;

CLOSE c_players;

END$$

DELIMITER ;

mysql> call number_of_players(@pnumber);

Query OK, 0 rows affected (0.00 sec)

mysql> select @pnumber;

+----------+

| @pnumber |

+----------+

| 14 |

+----------+

1 row in set (0.00 sec)

游标处理方式小结:

定义游标:将一个游标和一个select进行关联;

打开游标:将一个游标和一个结果集关联,执行了select;

获取游标(获取结果集):需要使用循环进行游标的获取。

{注意:当获取到最后一个结果集时,再次执行循环的时候,会报错,这个错误以2开头,

这个时候,需要定义一个对2开头的错误的捕获:

DECLARE CONTINUE HANDLER FOR NOT FOUND

SET FOUND = FALSE; }

关闭游标:结果集消失

资源释放。

七、存储过程权限问题

mysql>select ROUTINE_NAME,ROUTINE_SCHEMA,ROUTINE_TYPE from ROUTINES where ROUTINE_SCHEMA in('test','TENNIS');

GRANT EXECUTE --》授予执行权限

ON PROCEDURE number_penalties

TO 'u1'@'%';

[root@mysqlstudy ~]# mysql -uu1 -p12345678

mysql: [Warning] Using a password on the command line interface can be insecure.

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 7

Server version: 5.7.10 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use TENNIS;

Database changed

mysql> call number_penalties(44,@pnumber);

Query OK, 0 rows affected (0.01 sec)

mysql> select @pnumber;

+----------+

| @pnumber |

+----------+

| 3 |

+----------+

1 row in set (0.00 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql连网安装和断网安装的区别_linux连网和jdk环境配置以及mysql安装

1、启动网卡service network restart2、centos7联网方法以root管理员身份登录系统。在终端下输入以下两条命令ls /etc/sysconfig/network-scriptsvi /etc/sysconfig/network-scripts/ifcfg-ens33(根据自己电脑中实际的值来确定)在配置文件中重点设置BOOTPROTOdhcp,O…

mysql 事物 锁行 测试_MySQL Transaction--RR事务隔离级别下加锁测试

按照非索引列更新在可重复读的事务隔离级别下,在非索引列上进行更新和删除会对所有数据行进行加锁,阻止其他会话对边进行任何数据的增删改操作。如果更新或删除条件为c34且c3列上没有索引则:1、不允许其他会话插入任意记录,因为所…

修复mysql的view_MYSQL数据损坏修复方法

1、myisamchk使用 myisamchk 必须暂时停止 MySQL 服务器。例如,我们要检修 discuz 数据库。执行以下操作:# service mysql stop (停止 MySQL );# myisamchk -r /数据库文件的绝对路径/*MYI# service mysql startmyisamchk 会自动检查并修复数…

centos7mysql语句创建表格_CentOS7中安装MySQL(简便)及 网站的搭建

一、首先,我们需要配置CentOS7中网络环境的搭建,物理机IP为192.168.100.39,虚拟机IP为192.168.100.139,网络模式设置为桥接模式,再进入系统挂载光盘、输入命令 cd /yum.repos.d 修改yum源配置文件,接下…

mysql myisam 支持事务吗_第三章(附)mysql表类型MyISAM和InnoDB区别(决定了是否支持事务)...

mysql表类型MyISAM和InnoDB区别MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它…

mysql heartbeat lvs_CentOS 6.3 Mysql+heartbeat+drbd+LVS 的安装和配置(2)

yum install resource-agents pacemaker12. 修改heartbeat配置文件(以下步骤需要在2台node上执行)复制配置文件,资源文件,认证密钥文件cp /usr/share/doc/heartbeat-3.0.4/ha.cf /etc/ha.d/cp /usr/share/doc/heartbeat-3.0.4/haresources /etc/ha.d/cp /usr/share/doc/heartbe…

改变mysql的菜单栏的颜色_导航条——动态改变导航菜单的背景颜色

1.概述在浏览一些网站时,当鼠标经过导航菜单某一项时,其背景颜色将切换为其他颜色,实现这种简单的效果会更吸引浏览者的注意。2.技术要点本实例主要是应用JavaScript方法来动态改变标签的背景颜色实现的。当鼠标经过表示的导航菜单时&#xf…

mysql系列_Mysql系列(三)—— Mysql字符集和比较规则

一、前言字符集表示的是存储的二进制与字符如何映射的关系,比较规则指的是字符如何排序的规则,比如字符如果使用order by到底按什么规则进行排序。二、查看命令查看支持的字符集命令是:SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式],CHARA…

复数卷积 tensorflow_PyTorch 中的傅里叶卷积

欢迎关注 “小白玩转Python”,发现更多 “有趣”注意: 在这个 Github repo 中提供了1D、2D 和3D Fourier 卷积的完整方法。我还提供了 PyTorch 模块,可以方便地将傅里叶卷积添加到可训练模型中。链接如下:https://github.com/fkodom/fft-conv…

python3 枚举_Python3枚举类如何处理重复名称?

筛选重复的名称,相信对于各位小伙伴不是什么难事。那么,大家发现有重复的名称会如何进行解决呢?作为一位python的粉丝,小编优先选择的事这类的方法。在处理重复名称方面,小编选择的是用python3里的枚举法进行操作。没听…

python迷宫算法及实现_Python迷宫递归算法

所以我盯着这个有一段时间了,我不知道怎么才能回到这个迷宫的正确路径。在2代表墙MAZE [[2,2,2,2,1,2],[2,2,1,2,1,2],[2,2,1,2,1,2],[2,1,1,1,1,2],[2,1,2,2,2,2],[2,1,2,2,2,2]]START_ROW 5START_COL 1END_ROW 0END_COL 4was_here [[False]*6 for i in rang…

lucene索引MySQL原因_我如何在数据库中存储Lucene索引?

这是我的示例代码:MysqlDataSource dataSource new MysqlDataSource();dataSource.setUser("root");dataSource.setPassword("ncl");dataSource.setDatabaseName("userdb");dataSource.setEmulateLocators(true); //This is importa…

python time智能等待_Python Selenium智能等待

前言在使用python selenium进行自动化测试实践的过程中,经常会遇到元素定位不到,弹出框定位不到等等各种定位不到的情况,在大多数的情况下,无非是以下两种情况:1、有frame存在,定位前,未switch到…

python存储对象的数组_Python:在2d数组中存储对象并调用其方法

我正在尝试制作一个象棋应用程序。代码如下:#file containing pieces classesclass Piece(object):name "piece"value 0grid_name "____"class Pawn(Piece):# Rules for pawns.#If first move, then can move forward two spacesname "…

python正则表达式匹配括号并删除_如何使用正则表达式删除括号内的文本?

在括号匹配子串的图案不具有其他(和)字符之间(如(xyz 123)在Text (abc(xyz 123))是\([^()]*\)详细资料:\(-圆括号(请注意,在POSIX BRE中(应使用,请参见sed下面的示例)[^()]*-除否定的字符类别 / POSIX括号表达式中定义的字符以外的零个或多个…

现代软件工程 (备份)

自我介绍一下, 我叫邹欣, 是微软亚洲研究院 创新工程中心 首席研发主管 (Principal Development Manager). 我和同事们一起把研究成果转化为商业软件产品和服务。近期主要专注于垂直搜索,企业搜索,软件开发工具和数字娱乐等领域。 在工作之余, 我也写…

java钱_在Java中如何表示钱Money?

为什么不使用float / double?使用java时会遇到money类型的选择问题,首先想到的是float / double。如果只是简单的货币计算,很难发现用float会有问题。出现问题的原因是使用float / double(已经相应的包装类Float / Double)会出现舍入误差(rou…

期望

把原来一些关于软件工程,教学,和程序设计相关的博客搬过来。 [http://yishan.cc/blogs/xin/archive/2009/04/12/1058.aspx] 学校的期望 我在BBS 看到有人感慨说- 有家长让小孩在大学里专心学习,不要想别的。等到一毕业,就希望小孩…

java 数值变量_Java 中数值变量赋值问题

写了一段判断数值相等判断方法的程序://在-128~127 之外的数Integer i1 200;Integer i2 200;System.out.println("i1i2: "(i1i2));//false// 在-128~127 之内的数Integer i3 100;Integer i4 100;System.out.println("i3i4: "(i3i4));//true…

软件教育随想

[由于工作的关系,我在过去的几年中访问了十二三所软件学院/计算机学院,和不少老师,学生座谈过。我在研究院里也碰到了不少各个学校来的学生,谈得多了,就有下面的随想。] 想来的人来不了 学校里都是按照高考/考研的成绩…