目录

  • 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相关推荐

  1. mysql declare handler_MySQL 存储过程语句解释:DECLARE CONTINUE HANDLER FOR NOT FOUND

    在MySQL的存储过程中经常会看到这句话:DECLARE CONTINUE HANDLER FOR NOT FOUND. 它的含义是:若没有数据返回,程序继续,并将变量 IS_FOUND 设为 0 , ...

  2. mysql 存储过程 sqlstate_mysql存储过程(自定义函数之)declare continue handler for sqlstate '02000' set...

    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s=1; #当fetch游标到了数据库表格最后一行的时候,设置s=1 02000 主要代表的意思可以 ...

  3. mysql declare浮点数_MySQL - Belong_yucl - 博客园

    1.描述表得结构 desc table_name; desc table_name; 2.删除表中得数据 delete from table_name where [约束条件] delete from ...

  4. MYSQL存储过程中事务和DECLARE EXIT/CONTINUE HANDLER的使用

    1.DECLARE EXIT HANDLER FOR SQLEXCEPTION 语句后面可以跟一个 begin end的复合语句块,也可以直接跟一个简单语句例如 :DECLARE EXIT HANDL ...

  5. MySQL declare语句用法介绍

    MySQL declare语句是我们经常用到的语句,下文就为您举例说明了MySQL declare语句的用法,希望对您学习MySQL declare语句的使用能有所帮助. MySQL declare语 ...

  6. mysql declare 语法_sql_declare等语法 | 学步园

    ===sqlserver:---sql declare --简单赋值 declare @a int set @a=5 select @a --使用select语句赋值 declare @user1 n ...

  7. mysql declare 变量_mysql中用declare定义变量值时报错

    mysql中用declare定义变量值时报错 关键字:mysql 更新时间:2018-05-25 04:21:08 1517次访问 mysql> select version(); +----- ...

  8. mysql declare 赋值_sql server和mysql变量赋值的区别 以及 MySql Declare(转)

    sql server和mysql都是我们经常用到的数据库系统,下面就为您介绍sql server和mysql变量赋值的区别,希望对您能有所启迪. sql server中变量要先申明后赋值: 局部变量用 ...

  9. mysql declare与set的区别_浅谈MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

最新文章

  1. 浪潮刘军:为什么说计算力是AI时代“免费的午餐”?
  2. jquery对ajax的支持
  3. Android之自定义瀑布流式的标签列表
  4. Scalable, Distributed Systems Using Akka, Spring Boot, DDD, and Java--转
  5. OpenCV捕获正弦波模式
  6. 运动会成绩管理java代码_基于jsp的运动会成绩管理-JavaEE实现运动会成绩管理 - java项目源码...
  7. 微型计算机组装实验报告虚拟,微型计算机组装与维护实训(附光盘)
  8. 【python】range的用法
  9. Git 简介和命令行操作
  10. mac install: /usr/bin/unrar: Operation not permitted
  11. r0~r15寄存器作用
  12. python模块使用教程详解_python之mock模块基本使用方法详解
  13. GPS之家论坛最新地图下载精选 汇集论坛精华 不断更新中(2013.3.30)
  14. caj转pdf python_caj2pdf gui程序: 转换 CAJ 为 PDF。佛系转换,成功与否,皆是玄学。...
  15. 迭代收缩阈值算法matlab,一种基于自适应快速迭代收缩阈值算法的图像处理方法与流程...
  16. 分发自动化_使用bitrise自动化应用分发
  17. 定期年化40%,我把5000多个FIL全部存入了DMEX平台
  18. (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(DMA)
  19. 【软件测试】测试人的懊恼,你要揭开的秘密复现bug......
  20. 熔断器-hystrix使用

热门文章

  1. 首次披露!拍立淘技术框架及核心算法,日均UV超千万 2017-8
  2. 精心设置卡巴斯基 加快杀毒速度
  3. 智慧楼宇篇 1 —— 室内定位技术(一) - RFID室内定位技术
  4. 千字文带你入门typescript
  5. 尘埃落定,纪念我的校招(附腾讯,京东,YY,唯品会的面试题+个人前端心得体会)...
  6. 贵金属行情软件手机版哪个好
  7. Palo/Doris介绍
  8. 03FPGA—led灯的显示(入门)
  9. IT行业都包含哪些工作,具体职位都有什么?
  10. 高数考研归纳 - 级数 - 幂级数