1.cursor游标

用来声明一个数据集

游标的声明必须在变量和条件声明之后,在handler声明之前

游标特性:

不灵敏:服务器可以或不复制其结果

只读:不可更新

不可滚动的:只能在一个方向上遍历,不能跳过行

实例:

CREATE PROCEDURE curdemo()

BEGIN

DECLARE done INT DEFAULT FALSE;

DECLARE a CHAR(16);

DECLARE b,c INT;

DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;

DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done= TRUE;

OPEN cur1;

OPEN cur2;read_loop:LOOP

FETCH cur1 INTO a,b;

FETCH cur2 INTO c;

IF done THEN

LEAVE read_loop;

END IF;

IF b

INSERT INTO test.t3 VALUES (a,b);

ELSE

INSERT INTO test.t3 VALUES (a,c);

END IF;

END LOOP;

CLOSE cur1;

CLOSE cur2;

END;

说明:

cursor close用来关闭之前打开的游标;

如果关闭一个未打开的游标,则MySQL会报错;

如果在存储过程和函数中未使用此语句关闭打开的游标,则游标会在声明的begin...end语句块执行之后自动关闭;

cursor declare用来声明一个游标和指定游标对应的数据集合,通常数据集合是一个select语句。

DECLARE cursor_name CURSOR FOR select_statement

cursor fetch用来获取游标指定数据集的下一行数据并将各个字段值赋予后面的变量

FETCH [[NEXT] FROM] cursor_name INTO var_name [, var_name] ...

数据集中的字段需要和INTO语句中定义的变量一一对应

数据集中的数据都fetch完之后,则返回NOT FOUND

2.Declare condition语句

命名特定的错误条件,而该特定错误可以在declare...handler中指定处理方法

语法:

DECLARE condition_name CONDITION FOR condition_value

condition_value:mysql_error_code

| SQLSTATE [VALUE] sqlstate_value

说明:

condition_value指定特定的错误条件,有以下两种形式:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘v1 int default 5;

mysql_err_code表示MySQL error code的整数

sqlstate_value表示MySQL中用5位字符串表达的语句状态

DECLARE CONTINUE HANDLER FOR 1051

BEGIN

-- body of handler

END;

declare no_such_table condition for 1051;

declare continue handler for no_such_table

begin

--body of handler

end;

declare no_such_table condition for sqlstate ‘42S02‘

declare continue handler for no_such_table

begin

--body of handler

end;

3.Declare handler语句

语法:

DECLARE handler_action HANDLER

FOR condition_value [, condition_value] ...

statement

handler_action:CONTINUE

| EXIT

| UNDO

condition_value:mysql_error_code

| SQLSTATE [VALUE] sqlstate_value

| condition_name

| SQLWARNING

| NOT FOUND

| SQLEXCEPTION

用来声明一个handler来处理一个或多个特殊条件,当其中的某个条件满足时触发其中的SQL语句执行;

SQL可以使一个简单的语句,也可以是begin...end组成的多个语句;

handler_action声明当执行完SQL语句之后应该做什么:

CONTINUE表示继续执行该存储过程或函数

EXIT表示退出声明此handler的begin...end语句块

UNDO参数已不支持

condition_value的值有以下几种:

mysql_err_code表示MySQL error code的整数;

sqlstate_value表示MySQL中用5位字符串表达的语句状态;

condition_name表示之前在declare...condition语句中声明的名字;

SQLWARNING表示所有的警告信息,即sqlstate中01打头的所有错误;

NOT FOUND表示查完或查不到数据,即sqlstate中02打头的所有错误;

SQLEXCEPTION表示所有的错误信息

实例:

DECLARE CONTINUE HANDLER FOR 1051

BEGIN

-- body of handler

END;

DECLARE CONTINUE HANDLER FOR SQLSTATE ‘42S02‘

BEGIN

-- body of handler

END;

DECLARE CONTINUE HANDLER FOR SQLWARNING

BEGIN

-- body of handler

END;

DECLARE CONTINUE HANDLER FOR NOT FOUND

BEGIN

-- body of handler

END;

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION

BEGIN

-- body of handler

END;

当conditon发生但没有声明handler时,则存储过程和函数依照如下规则处理:

发生SQLEXCEPTION错误,则执行exit退出;

发生SQLWARNING警告,则执行continue继续执行;

发生NOT FOUND情况,则执行continue继续执行;

实例:

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

Query OK, 0 rows affected (0.35 sec)

SQLSTATE ‘23000‘表示主键冲突

mysql> delimiter //

mysql> 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;

-> INSERT INTO test.t VALUES (1);

-> SET @x = 3;

-> END;

-> //

Query OK, 0 rows affected (0.00 sec)

mysql> call handlerdemo();

-> //

Query OK, 0 rows affected (0.03 sec)

mysql> delimiter ;

mysql> select @x;

+------+

| @x |

+------+

| 3 |

+------+

1 row in set (0.00 sec)

实例:

mysql> delimiter //

mysql> create procedure curdemo()

-> begin

-> declare done int default false;

-> declare a char(16);

-> declare b,c int;

-> declare cur1 cursor for select id,data from t1;

-> declare cur2 cursor for select i from test.t2;

-> declare continue handler for not found set done = true;

-> open cur1;

-> open cur2;

-> read_loop:loop

-> fetch cur1 into a,b;

-> fetch cur2 into c;

-> if done then

-> leave read_loop;

-> end if;

-> if b

-> insert into test.t3 values(a,b);

-> else

-> insert into test.t3 values(a,c);

-> end if;

-> end loop;

-> close cur1;

-> close cur2;

-> end//

Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

MySQL-5.7 游标及DECLARE

标签:错误   leave   next   tab   statement   creat   执行   ...   使用

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:http://www.cnblogs.com/tongxiaoda/p/8024508.html

mysql.5.7 declare_MySQL-5.7 游标及DECLARE相关推荐

  1. mysql cursor 嵌套_MYSQL 存储过程多游标嵌套遍历

    mysql 存储过程临时表.多游标嵌套使用样例: CREATE PROCEDURE method(IN start_Code varchar(10),IN end_Code varchar(10),i ...

  2. MySQL 学习笔记(7)—— 游标

    1. 游标 有时,需要在检索出来的行中前进或后退一行或多行.这就是使用游标的原因. 游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结 ...

  3. 一条一条来,MySQL变量、流程控制与游标,完整详细可收藏

    文章目录 1. 变量 2. 定义条件与处理程序 3. 流程控制 4. 游标 MySQL8的新特性-全局变量的持久化 1. 变量 在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间 ...

  4. mysql游标 原理解说_mysql存储过程之游标(DECLARE)原理与用法详解

    本文实例讲述了mysql存储过程之游标(DECLARE)原理与用法.分享给大家供大家参考,具体如下: 我们在处理存储过程中的结果集时,可以使用游标,因为游标允许我们迭代查询返回的一组行,并相应地处理每 ...

  5. mysql cursor使用变量_mysql cursor游标的使用,实例

    mysql被oracle收购后,从mysql-5.5开始,将InnoDB作为默认存储引擎,是一次比较重大的突破.InnoDB作为支持事务的存储引擎,拥有相关的RDBMS特性:包括ACID事务支持,数据 ...

  6. mysql自定义函数、存储过程、游标、触发器、事件(定时任务)

    创建函数FUN_GET_ORG_CHILD(rootId) CREATE FUNCTION `FUN_GET_ORG_CHILD`(rootId varchar(100))RETURNS varcha ...

  7. mysql 游标循环_mysql for循环遍历 游标用处

    以前一直不知道游标的作用,之前的结果集遍历 博主一直用的是记录查询出来的记录总数并一条条用LIMIT 1 OFFSET index 进行查找,并进行处理的. 现在终于会使用游标了,献上一个小例子供大家 ...

  8. mysql 存储过程声明式游标_Mysql 存储过程中使用游标循环读取临时表

    游标 游标(Cursor)是用于查看或者处理结果集中的数据的一种方法.游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力. 游标的使用方式 定义游标:Declare 游标名称 CURSOR ...

  9. mysql存储过程在实际开发中怎么用_MYSQL存储过程开发中怎么使用游标嵌套

    mysql存储过程开发中如何使用游标嵌套 在实际业务逻辑开发中,难免用到游标嵌套,举例如下: delimiter // drop procedure if exists good_nested_cur ...

  10. mysql 函数 局部变量_MySQL 存储过程 存储函数 局部变量 游标 概念示例

    一个存储过程是一个可编程的函数,它可以在MySQL中创建并保存.它是由一些SQL语句和一些特殊的控制结构语句组成. 当希望在不同的应用程序或平台上执行相同的函数,或者封装特定的功能时,存储过程是一个非 ...

最新文章

  1. 大数据技术-hive窗口函数详解
  2. 微服务化之缓存的设计
  3. java 权限url权限_SpringBootSecurity学习(11)网页版登录之URL动态权限
  4. 逆向so_安卓逆向 | 分析调试与so调用实战
  5. mysql load 占位符,mysql:用不存在的数据的占位符初始化摘要表
  6. 10道经典MySQL面试题
  7. wait与notify
  8. 很多人认为自己赚不到钱是因为没钱,真的是这样吗?
  9. 数据结构与算法 —— 向量的扩容策略与分摊时间复杂度
  10. 免费分享20套PHP源码
  11. WPS永久关闭热点、云服务、初始登陆界面
  12. Revit二次开发资料汇总
  13. python转码时出现'illegal multibyte sequen'错误
  14. 四个Channel的讲解
  15. android短信过滤关键词,iOS 11的垃圾短信按关键词过滤功能使用介绍
  16. OCR 文字特征提取
  17. RTL8211F 硬件配置
  18. 【Redis 如何实现库存扣减操作】
  19. 蚂蚁金服高级技术专家李福喜 :蚂蚁开放平台技术路线及行业实践
  20. 除了Kaggle,这里还有一些含金量高的数据科学竞赛哦

热门文章

  1. 安装ssd后不识别网卡_群晖E10M20-T1:你以为它是张网卡,其实它还带俩SSD
  2. python中可变参数*args传入函数时的存储方式为,Python函数可变参数(*args,**kwargs)详解...
  3. MyEclipse的破解
  4. ai怎么平均排列_一篇AI打麻将的论文,理科生眼中的麻将是这样的
  5. vb2008 获取mac地址_华为 荣耀路由Pro 设置MAC地址克隆的方法?华为荣耀路由器怎么设置...
  6. 晶振噪声及杂散_石英晶体振荡器(简称晶振)介绍
  7. python类和对象实验报告_python类和对象
  8. 【Python笔记】Python/C++解决约瑟夫环问题
  9. mysql5.5 mysqldump_mysql5.5mysqldump原文翻译_MySQL
  10. 键盘拆开重新安装步骤_电脑键盘如何维修 电脑键盘常见问题维修技巧【详解】...