|字号 订阅

1、游标的作用及属性

游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作;游标有下面这些属性:

a、游标是只读的,也就是不能更新它;

b、游标是不能滚动的,也就是只能在一个方向上进行遍历,不能在记录之间随意进退,不能跳过某些记录;

c、避免在已经打开游标的表上更新数据。

2、如何使用游标

使用游标需要遵循下面步骤:

a、首先用DECLARE语句声明一个游标

  1. DECLARE cursor_name CURSOR FOR SELECT_statement;

上面这条语句就对,我们执行的select语句返回的记录指定了一个游标

b、其次需要使用OPEN语句来打开上面你定义的游标

  1. OPEN cursor_name;

c、接下来你可以用FETCH语句来获得下一行数据,并且游标也将移动到对应的记录上(这个就类似java里面的那个iterator)。

  1. FETCH cursor_name INTO variable list;

d、然后最后当我们所需要进行的操作都结束后我们要把游标释放掉。

  1. CLOSE cursor_name;

在使用游标时需要注意的是,使用定义一个针对NOT FOUND的条件处理函数(condition handler)来避免出现“no data to fetch”这样的错误,条件处理函数就是当某种条件产生时所执行的代码,这里但我们游标指到记录的末尾时,便达到NOT FOUND这样条件,这个时候我们希望继续进行后面的操作,所以我们会在下面的代码中看到一个CONTINUE。先看看我们的表格内容:

下面的游标使用演示获取库存量小于100的产品的代码code,这个代码纯粹演示如何使用,在这里没有其他任何意义:)

  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS `test`.`CursorProc` $$
  3. CREATE PROCEDURE `test`.`CursorProc` ()
  4. BEGIN
  5. DECLARE  no_more_products, quantity_in_stock INT DEFAULT 0;
  6. DECLARE  prd_code VARCHAR(255);
  7. DECLARE  cur_product CURSOR FOR   SELECT code FROM products;  /*First: Delcare a cursor,首先这里对游标进行定义*/
  8. DECLARE  CONTINUE HANDLER FOR NOT FOUND  SET  no_more_products = 1; /*when "not found" occur,just continue,这个是个条件处理,针对NOT FOUND的条件*/
  9. /* for  loggging information 创建个临时表格来保持*/
  10. CREATE TEMPORARY TABLE infologs (
  11. Id int(11) NOT NULL AUTO_INCREMENT,
  12. Msg varchar(255) NOT NULL,
  13. PRIMARY KEY (Id)
  14. );
  15. OPEN  cur_product; /*Second: Open the cursor 接着使用OPEN打开游标*/
  16. FETCH  cur_product INTO prd_code; /*Third: now you can Fetch the row 把第一行数据写入变量中,游标也随之指向了记录的第一行*/
  17. REPEAT
  18. SELECT  quantity INTO quantity_in_stock
  19. FROM  products
  20. WHERE  code = prd_code;
  21. IF  quantity_in_stock < 100 THEN
  22. INSERT  INTO infologs(msg)
  23. VALUES  (prd_code);
  24. END  IF;
  25. FETCH  cur_product INTO prd_code;
  26. UNTIL  no_more_products = 1
  27. END REPEAT;
  28. CLOSE  cur_product;  /*Finally: cursor need be closed 用完后记得用CLOSE把资源释放掉*/
  29. SELECT *  FROM infologs;
  30. DROP TABLE  infologs;
  31. END $$
  32. DELIMITER ;

下面是最终的结果:

  1. <img src="http://my.csdn.net/uploads/201



MySql存储过程—7、游标(Cursor)的更多相关文章

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

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

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

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

  3. MariaDB MariaDB、MySQL存储过程、游标基础应用举例说明

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

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

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

  5. mysql存储过程之游标

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

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

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

  7. MySQL存储过程和游标

    一.存储过程 什么是存储过程,为什么要使用存储过程以及如何使用存储过程,并且介绍创建和使用存储过程的基本语法. 什么是存储过程: 存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些 ...

  8. 解析MySQL存储过程的游标执行过程

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 内容提纲 一.测试环境搭建 二.执行过程解析 三.注意事项 一.测试环境搭建 首先创建一张表,并插入几行数据字段: CRE ...

  9. Mysql 存储过程使用游标

    -- 完整例子 CREATE PROCEDURE test BEGIN -- 定义参数    DECLARE _id INT; -- 定义游标    DECLARE no_more_products ...

  10. MySQL存储过程-->通过游标遍历和异常处理迁移数据到历史表

    -- 大表数据迁移,每天凌晨1点到5点执行,执行间隔时间10分钟,迁移旧数据到历史表. DELIMITER $$ USE `dbx`$$ DROP PROCEDURE IF EXISTS `pro_x ...

随机推荐

  1. curl file_get_contents fsockopen

    三种处理的方式:     curl     file_get_contents     fsockopen fsockopen 是比较底层的调用,属于网络系统的socket调用,而curl经过的包装支 ...

  2. 给Notepad++ 加带图标右键菜单

    给Notepad++ 加带图标右键菜单 方式一: 拷贝以下代码建立一个reg文件,替换相关路径,保存,双击运行加入注册表 Windows Registry Editor Version 5.00 [H ...

  3. 记一次坑die(误)的题目--HDU2553--(DFS)

    ,N皇后问题   Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  4. Linux学习 -- Shell基础 -- 概述

    Shell是什么? 命令解释器 编程语言 Linux支持的Shell类型 cat /etc/shells 主要学习 bash 脚本执行方式 echo echo -e 单引号 -- 原始字符串  双引号 ...

  5. 多校 Babelfish

    题目链接:http://acm.hust.edu.cn/vjudge/contest/124435#problem/A 密码:acm Sample Input dog ogday cat atcay ...

  6. php csv操作

    csv的写入数据: $data = array( array('qq号','登录时间','名称'), array('123456','2012-08-21 15:21:10'.chr(1),'我是来测 ...

  7. 开源内容管理系统Joomla正式发布3.5版本 基于PHP 7

    这也是首个完全支持 PHP 7 语言开发的 Joomla 版本 作为深受广大站长喜爱的 Joomla 开源内容管理系统(Content Management System, CMS)正式推出 3.5 ...

  8. Can't create handler inside thread that has not called Looper.prepare() 终极解决方法

    非主线程中出现 在报错的方法前加Looper.prepare(); 方法末尾加Looper.loop(); 很简单吧

  9. ms10_046_shortcut_icon_dllloader漏洞利用和ettercap dns欺骗

    ms10_046_shortcut_icon_dllloader漏洞利用过程 msf > use exploit/windows/browser/ms10_046_shortcut_icon_d ...

  10. Activity进程和线程之间的关系

    1,四大组件并不是程序(进程)的全部,只是他的零件. 2,应用程序启动后,将创建ActivityThread主线程. 3,同一包中的组件将运行在想通的进程空间里面. 4,不同包中的组件可以通过一定的方 ...