MySQL-5.7 游标及DECLARE

时间:2022-09-10 20:07:59

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<c THEN
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<c then
-> 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的更多相关文章

  1. MYSQL存储过程、游标、触发器

    MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成  存储过程简单来说,就是为以后的使用而保存的一 ...

  2. mysql存储过程之游标遍历数据表

    原文:mysql存储过程之游标遍历数据表 今天写一个mysql存储过程,根据自己的需求要遍历一个数据表,因为对存储过程用的不多,语法不甚熟悉,加之存储过程没有调试环境,花了不少时间才慢慢弄好,故留个痕 ...

  3. MySQL笔记 存储过程 游标 触发器

    第二十三章 使用存储过程 MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就 ...

  4. MySQL存储过程之游标实战

    MySQL存储过程之游标实战 ​ 博主日前在解决一个项目需求时,没有什么好的方法,于是就来学习存储过程了,之前也是接触过,奈何年少贪玩,竟是全部又还给了大学老师-苦不堪言呐-. ​ 先说一下业务需求吧 ...

  5. MariaDB&&num;160&semi;MariaDB、MySQL存储过程、游标基础应用举例说明

    MariaDB.MySQL存储过程.游标基础应用举例说明 by:授客 QQ:1033553122 测试环境: MariaDB-10.0.19-centos7-x86_64 实践操作: # 创建测试数据 ...

  6. MYSQL学习拓展一:MySQL 存储过程之游标的使用!

    一.MySQL游标的概念 游标介绍: MySQL的游标(cursor)是一个重要的概念,通过查找资料与自己的理解,主要得出以下几点关于自己的理解. 有数据缓冲的思想:游标的设计是一种数据缓冲区的思想, ...

  7. Mysql高级之游标

    原文:Mysql高级之游标 什么是游标?select 语句也许一次性会取出来n条语句,那么游标便可以一次取出来select中的一条记录.每取出来一条,便向下移动一次!可以实现很复杂逻辑! 上面还有有一 ...

  8. mysql之——存储过程 &plus; 游标 &plus; 事务

    下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考. 其中,涉及到了存储过程.游标(双层循环).事务. [说明]:代码中的注释只针对当时业务而言,无须理会. 代码如下: ...

  9. mysql进阶&lpar;三&rpar;游标简易教程

    mysql游标简易教程 从mysql V5.5开始,进行了一次大的改变,就是将InnoDB作为默认的存储引擎.InnoDB支持事务,而且拥有相关的RDBMS特性:ACID事务支持,数据完整性(支持外键 ...

随机推荐

  1. Maven3路程(三)用Maven创建第一个web项目&lpar;1&rpar;

    一.创建项目 1.Eclipse中用Maven创建项目 上图中Next 2.继续Next 3.选maven-archetype-webapp后,next 4.填写相应的信息,Packaged是默认创建 ...

  2. MVC ajaxSubmit上传图片

    注意事项: 1.提交form,必须引用jquery.form.min.js 2.不要使用mvc自带的Ajax.Form() 1.页面cshtml <form name="frmInpu ...

  3. Java Web中web&period;xml的作用

    每一个javaWeb工程都有一个web.xml配置文件,那么他到底有什么作用呢?它是每一个web工程都必的必须的吗?   web.xml文件是用来初始化工程配置信息的,比如说welcome页面,fil ...

  4. Python图像处理之图片文字识别(OCR)

    OCR与Tesseract介绍   将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR).可以实现OCR 的底层库并不多,目前很多库都是使用共同 ...

  5. node&period;js打印function

    var Person = function(name) { this.name = name; this.gender = ['man', 'woman']; } console.log(Person ...

  6. 用PRODUCT&lowbar;COPY&lowbar;FILES拷贝文件夹

    拷贝文件PRODUCT_COPY_FILES += device/qcom/msm8909/media/media_profiles_8909.xml:system/etc/media_profile ...

  7. Ex 6&lowbar;18 硬币有限的兑换问题&lowbar;第七次作业

    子问题定义: 定义一个二维数组b,其中b[i][j]表示前i个币种是否能兑换价格j,表示第i个币种的面值,第i个币种的使用有两种情况,若使用,则b[i][j]=b[i-1][j-],若不使用,则b[i ...

  8. Navicat for Oracle 绿色版 连接 Oracle 12c

    亲测可用,留下文章以备忘记. Navicat for Oracle 绿色版 地址 链接:http://pan.baidu.com/s/1qY5wMok 密码:kw06 解压到一个目录下. 然后还需要O ...

  9. what&&num;39&semi;s the 回撤

    什么是“回撤”? “回撤”是个谓语,前面隐含了一个主语.一般来说,没有人说“亏损回撤”的,我们说的“回撤”,通常指“股价回撤”.“市值回撤”.“净值回撤”和“盈利回撤”. “股价回撤”是针对个股的,即 ...

  10. &lbrack;转帖&rsqb;通俗解释 AWS 云服务每个组件的作用

    你有听说过 ContainerCache,ElastiCast 和 QR72 这些 AWS 的新服务吗? 没有就对了,这些都是我编的:) 不过,AWS 有 50 多个服务,从名称也不能看出这些服务是做 ...