1月阅读周·MySQL数据库入门:存储过程的创建之定义条件和处理程序篇
【摘要】 背景去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。没有计划的阅读,收效甚微。新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。这个“玩法”虽然常见且板正,但是有效,已经坚持阅读十二个月。已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScr...
背景
去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。
没有计划的阅读,收效甚微。
新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。
这个“玩法”虽然常见且板正,但是有效,已经坚持阅读十二个月。
已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScript(中卷)》、《你不知道的JavaScript(下卷)》、《数据结构与算法JavaScript描述》、《WebKit技术内幕》、《前端架构:从入门到微前端》、《秒懂算法:用常识解读数据结构与算法》、《JavaScript权威指南》、《JavaScript异步编程设计快速响应的网络应用》、《编写可测试的JavaScript代码》。
当前阅读周书籍:《MySQL数据库入门》。
定义条件和处理程序
在实际开发中,经常需要对特定的条件进行处理,这些条件可以联系到错误以及子程序中的一般流程控制。定义条件是事先定义程序执行过程中遇到的问题,处理程序定义了在遇到这些问题时应当采取的处理方式,并且保证存储过程在遇到警告或错误时能继续执行。接下来将针对定义条件和处理程序进行详细的讲解。
1.定义条件
在编写存储过程时,定义条件使用DECLARE语句,语法格式如下:
DECLARE condition_name CONDITION FOR [condition_type];
// condition_type的两种形式:
[condition_type]:
SQLSTATE[VALUE] sqlstate_value|mysql_error_code
上述语法格式中,condition_name表示所定义的条件的名称;condition_type表示条件的类型;sqlstate_value和mysql_error_code都可以表示MySQL的错误,sqlstate_value是长度为5的字符串类型错误代码,mysql_error_code为数值类型的错误代码。例如:ERROR1142(42000)中,sqlstate_value的值是42000,mysql_error_code的值是1142。
上述语法格式指定了需要特殊处理的条件。它将一个名字和指定的错误条件关联起来。这个名字可以随后被用在定义处理程序的DECLARE HANDLER语句中。
【例1-1】 定义“ERROR1148(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.定义处理程序
定义完条件后,还需要定义针对此条件的处理程序。MySQL中用DECLARE语句定义处理程序,具体语法格式如下:
DECLARE handler_type HANDLER FOR condition_value[,…] sp_statement
handler_type:
CONTINUE|EXIT|UNDO
condition_value:
|condition_name
|SQLWARNING
|NOT FOUND
|SQLEXCEPTION
|mysql_error_code
上述语法格式中,handler_type为错误处理方式,参数取三个值:CONTINUE、EXIT和UNDO。CONTINUE表示遇到错误不处理,继续执行;EXIT表示遇到错误马上退出;UNDO表示遇到错误后撤回之前的操作,MySQL中暂时不支持这样的操作。sp_statement参数为程序语句段,表示在遇到定义的错误时,需要执行的存储过程;condition_value表示错误类型,可以有以下取值。
(1)SQLSTATE[VALUE] sqlstate_value包含5个字符的字符串错误值。
(2)condition_name表示DECLARE CONDITION定义的错误条件名称。
(3)SQLWARNING匹配所有以01开头的SQLSTATE错误代码。
(4)NOT FOUND匹配所有以02开头的SQLSTATE错误代码。
(5)SQLEXCEPTION匹配所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE错误代码。
(6)mysql_error_code匹配数值类型错误代码。
【例1-2】 定义处理程序的几种方式,具体代码如下:
//方法一: 捕获sqlstate_value
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02'SET @info='NO_SUCH_TABLE';
//方法二: 捕获mysql_error_code
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='ERROR';
//方法四: 使用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';
上述代码中演示了6种定义处理程序的方法。接下来将分别进行分析讲解,具体如下。
第一种方法是捕获sqlstate_value值。如果遇到sqlstate_value值为“42S02”,则执行CONTINUE操作,并且输出“NO_SUCH_TABLE”信息。
第二种方法是捕获mysql_error_code值,如果遇到mysql_error_code值为1146,则执行CONTINUE操作,并且输出“NO_SUCH_TABLE”信息。
第三种方法是先定义条件,然后再调用条件。这里先定义no_such_table条件,遇到1146错误就执行CONTINUE操作。
第四种方法是使用SQLWARNING,SQLWARNING捕获所有以01开头的sqlstate_value值,然后执行EXIT操作,并且输出“ERROR”信息。
第五种方法是使用NOT FOUND, NOT FOUND捕获所有以02开头的sqlstate_value值,然后执行EXIT操作,并且输出“NO_SUCH_TABLE”信息。
第六种方法是使用SQLEXCEPTION,SQLEXCEPTION捕获所有没有被SQLWARNING或NOT FOUND捕获的sqlstate_value值,然后执行EXIT操作,并且输出“ERROR”信息。
【例1-3】 定义条件和处理程序,具体执行过程如下:
mysql>CREATE TABLE test.t(s1 int,primary key(s1));
Query OK, 0 rows affected (0.44 sec)
mysql>DELIMITER //
mysql>CREATE PROCEDURE demo()
->BEGIN
->DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2=1;
->SET @x=1;
->INSERT INTO test.t VALUES(1);
->SET @x=2;
->INSERT INTO test.t VALUES(1);
->SET @x=3;
->END; //
Query OK, 0 rows affected (0.09 sec)
mysql>DELIMITER;
/*调用存储过程*/
mysql>CALL demo();
Query OK, 0 rows affected (0.08 sec)
mysql>SELECT @x ;
+------+
| @x |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
@x是一个用户变量,执行@x等于3,这表明MySQL被执行到程序的末尾。如果没有“DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2=1;”这句代码,第二个INSERT会因PRIMARY KEY强制而失败之后,MySQL可能已经采取默认(EXIT)路径,并且SELECT @x会返回2。
需要注意的是,“@var_name”表示用户变量,使用SET语句为其赋值,用户变量与连接有关,一个客户端定义的变量不能被其他客户端看到或使用。当客户端退出时,该客户连接的所有变量将自动释放。上述案例中存储过程的调用和查询会在后面章节中进行详细的讲解,这里读者只需了解即可。
总结
在开发过程中,经常会遇到重复使用某一功能的情况,为此,MySQL引入了存储过程。存储过程就是一条或多条SQL语句的集合,当对数据库进行一系列复杂操作时,存储过程可以将这些复杂操作封装成一个代码块,以便重复使用,大大减少数据库开发人员的工作量。
在实际开发中,经常需要对特定的条件进行处理,这些条件可以联系到错误以及子程序中的一般流程控制。定义条件是事先定义程序执行过程中遇到的问题,处理程序定义了在遇到这些问题时应当采取的处理方式,并且保证存储过程在遇到警告或错误时能继续执行。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)