MYSQL-DECLARE CONTINUE HANDLER FOR NOT FOUND SET FOUND=FALSE
目录
- DECLARE ... HANDLER语句
- statement
- handler_action
- condition_value
- 1. mysql_error_code:MySQL的错误码,整数类型。
- 2.SQLSTATE :用5个字符表示的SQLSTATE值。
- 3. condition_name:使用DECLARE ... CONDITION定义的条件的名称。
- 4.SQLWARNING:相当于值从'01'开始的SQLSTATE 。
- 5. NOT FOUND:相当于值从'02'开始的SQLSTATE 。
- 6. SQLEXCEPTION:相当于值不为'00','01','02'的所有 SQLSTATE。
- 实例
- 简单实例讲解
- 完整实例, 创建一个存储过程,用于计算表customers中数据行的行数
DECLARE … HANDLER语句
MYSQL官方文档
//在一个或者多个condition_value满足时,先执行statement语句,然后执行handler_action动作。
DECLARE handler_action HANDLERFOR condition_value [, condition_value] ...statement
Mysql中,定义一个handler处理一个或多个条件(condition_value ),如果某一个条件被触发, 则会执行定义的SQL语句(statement),然后执行动作(handler_action)。下面对statement、condition_value、handler_action这三个元素进行分别解释。
statement
statement语句可以是一行简单的SQL语句,如SET var_name = value,也可以是多行复杂的的SQL语句,但多行SQL语句需要使用BEGIN和END包围。
这里的SET FOUND=FALSE就是一条statement,至于词句完整含义,在最后讲解
DECLARE CONTINUE HANDLER FOR NOT FOUND SET FOUND=FALSE;
handler_action
条件被满足时,执行定义好的SQL语句,然后再执行动作。主要有以下三种选择:
handler_action的取值如下:
handler_action: {CONTINUE| EXIT| UNDO
}
CONTINUE:表示继续执行当前SQL脚本。
EXIT:表示终止执行当前SQL脚本。即使condition_value由statement语句的BEGIN…AND语句块引发,也是一样会终止执行。
condition_value
六种条件类型
condition_value: {mysql_error_code| SQLSTATE [VALUE] sqlstate_value| condition_name| SQLWARNING| NOT FOUND| SQLEXCEPTION
}
下面是这6种条件的释义:
1. mysql_error_code:MySQL的错误码,整数类型。
DECLARE CONTINUE HANDLER FOR 1051
BEGIN-- body of handler
END;
MySQL错误码取值
2.SQLSTATE :用5个字符表示的SQLSTATE值。
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02'
BEGIN-- body of handler
END;
以’00’开始的值表示成功。
SQLSTATE的完整取值列表
3. condition_name:使用DECLARE … CONDITION定义的条件的名称。
如何使用DECLARE … CONDITION定义条件
4.SQLWARNING:相当于值从’01’开始的SQLSTATE 。
5. NOT FOUND:相当于值从’02’开始的SQLSTATE 。
比如说,你执行以下语句时
select * from user_role r where r.user_id = p_id;
如果找不到数据,那么就满足了not found这个条件,就会执行set done=true这条指令。
declare continue handler for not found set done = true;
总结:NOT FOUND可能被触发的条件有:
- SELECT INTO 语句或 INSERT 语句的子查询的结果为空表。
- 在搜索的 UPDATE 或 DELETE 语句内标识的行数为零。
- 在 FETCH 语句中引用的游标位置处于结果表最后一行之后。
6. SQLEXCEPTION:相当于值不为’00’,‘01’,'02’的所有 SQLSTATE。
实例
简单实例讲解
这个例子是最开始提到的,我们知道了每个语句的含义,现在就可以对如下语句进行解析了
DECLARE CONTINUE HANDLER FOR NOT FOUND SET FOUND=FALSE;
SQL脚本....
handler_action:CONTINUE,执行动作,表示继续执行当前SQL脚本。
condition_value :NOT FOUND,触发条件
statement:SET FOUND=FALSE;定义的SQL语句
对应关系如上,如果执行Sql脚本到某一步时,NOT FOUND被触发,执行SET FOUND=FALSE;然后继续执行SQL脚本的接下来部分
完整实例, 创建一个存储过程,用于计算表customers中数据行的行数
DELIMITER $$
CREATE PROCEDURE sp_sumofrow(OUT ROWS INT)
BEGIN
DECLARE cid INT;
DECLARE FOUND BOOLEAN DEFAULT TRUE ;
DECLARE cur_cid CURSOR FOR
SELECT cust_id FROM customers;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET FOUND=FALSE;
SET ROWS=0;
OPEN cur_cid;
FETCH cur_cid INTO cid;
WHILE FOUND DO
SET ROWS=ROWS+1;
FETCH cur_cid INTO cid;
END WHILE;
CLOSE cur_cid;
END $$
调用
CALL sp_sumofrow(@customers_rows);
SELECT @customers_rows;
Java基础不好的小水怪,正在学习。有错请指出,一起加油。
MYSQL-DECLARE CONTINUE HANDLER FOR NOT FOUND SET FOUND=FALSE相关推荐
- mysql declare handler_MySQL 存储过程语句解释:DECLARE CONTINUE HANDLER FOR NOT FOUND
在MySQL的存储过程中经常会看到这句话:DECLARE CONTINUE HANDLER FOR NOT FOUND. 它的含义是:若没有数据返回,程序继续,并将变量 IS_FOUND 设为 0 , ...
- mysql 存储过程 sqlstate_mysql存储过程(自定义函数之)declare continue handler for sqlstate '02000' set...
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s=1; #当fetch游标到了数据库表格最后一行的时候,设置s=1 02000 主要代表的意思可以 ...
- mysql declare浮点数_MySQL - Belong_yucl - 博客园
1.描述表得结构 desc table_name; desc table_name; 2.删除表中得数据 delete from table_name where [约束条件] delete from ...
- MYSQL存储过程中事务和DECLARE EXIT/CONTINUE HANDLER的使用
1.DECLARE EXIT HANDLER FOR SQLEXCEPTION 语句后面可以跟一个 begin end的复合语句块,也可以直接跟一个简单语句例如 :DECLARE EXIT HANDL ...
- MySQL declare语句用法介绍
MySQL declare语句是我们经常用到的语句,下文就为您举例说明了MySQL declare语句的用法,希望对您学习MySQL declare语句的使用能有所帮助. MySQL declare语 ...
- mysql declare 语法_sql_declare等语法 | 学步园
===sqlserver:---sql declare --简单赋值 declare @a int set @a=5 select @a --使用select语句赋值 declare @user1 n ...
- mysql declare 变量_mysql中用declare定义变量值时报错
mysql中用declare定义变量值时报错 关键字:mysql 更新时间:2018-05-25 04:21:08 1517次访问 mysql> select version(); +----- ...
- mysql declare 赋值_sql server和mysql变量赋值的区别 以及 MySql Declare(转)
sql server和mysql都是我们经常用到的数据库系统,下面就为您介绍sql server和mysql变量赋值的区别,希望对您能有所启迪. sql server中变量要先申明后赋值: 局部变量用 ...
- mysql declare与set的区别_浅谈MySQL存储过程中declare和set定义变量的区别
在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...
最新文章
- 浪潮刘军:为什么说计算力是AI时代“免费的午餐”?
- jquery对ajax的支持
- Android之自定义瀑布流式的标签列表
- Scalable, Distributed Systems Using Akka, Spring Boot, DDD, and Java--转
- OpenCV捕获正弦波模式
- 运动会成绩管理java代码_基于jsp的运动会成绩管理-JavaEE实现运动会成绩管理 - java项目源码...
- 微型计算机组装实验报告虚拟,微型计算机组装与维护实训(附光盘)
- 【python】range的用法
- Git 简介和命令行操作
- mac install: /usr/bin/unrar: Operation not permitted
- r0~r15寄存器作用
- python模块使用教程详解_python之mock模块基本使用方法详解
- GPS之家论坛最新地图下载精选 汇集论坛精华 不断更新中(2013.3.30)
- caj转pdf python_caj2pdf gui程序: 转换 CAJ 为 PDF。佛系转换,成功与否,皆是玄学。...
- 迭代收缩阈值算法matlab,一种基于自适应快速迭代收缩阈值算法的图像处理方法与流程...
- 分发自动化_使用bitrise自动化应用分发
- 定期年化40%,我把5000多个FIL全部存入了DMEX平台
- (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(DMA)
- 【软件测试】测试人的懊恼,你要揭开的秘密复现bug......
- 熔断器-hystrix使用