1、游标的作用及属性

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

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

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

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

2、如何使用游标

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

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

  1. DECLARE cursor_name CURSORFOR SELECT_statement;
DECLARE cursor_name CURSOR FOR SELECT_statement;

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

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

  1. OPEN cursor_name;
OPEN cursor_name;

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

  1. FETCH cursor_name INTO variable list;
FETCH cursor_name INTO variable list;

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

  1. CLOSE cursor_name;
CLOSE cursor_name;

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

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

  1. DELIMITER $$
  2. DROPPROCEDURE IF EXISTS `test`.`CursorProc` $$
  3. CREATEPROCEDURE `test`.`CursorProc` ()
  4. BEGIN
  5. DECLARE  no_more_products, quantity_in_stock INTDEFAULT 0;
  6. DECLARE  prd_code VARCHAR(255);
  7. DECLARE  cur_product CURSORFOR   SELECT code FROM products;  /*First: Delcare a cursor,首先这里对游标进行定义*/
  8. DECLARE  CONTINUE HANDLER FORNOT FOUND  SET  no_more_products = 1; /*when"not found" occur,just continue,这个是个条件处理,针对NOT FOUND的条件*/
  9. /* for  loggging information 创建个临时表格来保持*/
  10. CREATETEMPORARYTABLE infologs (
  11. Id int(11) NOTNULL AUTO_INCREMENT,
  12. Msg varchar(255) NOTNULL,
  13. PRIMARYKEY (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. DROPTABLE  infologs;
  31. END $$
  32. DELIMITER ;
DELIMITER $$

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

下面是最终的结果:

  1. <img alt="" src="http://my.csdn.net/uploads/201208/18/1345302174_3501.png">

mysql 存储过程 游标的使用 与定义的更多相关文章

  1. MySQL存储过程 游标

    MySQL存储过程  游标 如何在存储过程中使用MySQL游标来遍历SELECT语句返回的结果集 MySQL游标简介 要处理存储过程中的结果集,请使用游标.游标允许您迭代查询返回的一组行,并相应地处理 ...

  2. mysql存储过程游标嵌套循环

    自己写的一个mysql存储过程如下: BEGIN DECLARE _did bigint(20);DECLARE _count int;DECLARE s1 int;DECLARE cur_1 CUR ...

  3. mysql -- 存储过程中 declare 和 set 定义变量的区别

    mysql存储过程中,定义变量有两种方式:1.使用set或select直接赋值,变量名以 @ 开头.例如:set @var=1;可以在一个会话的任何地方声明,作用域是整个会话,称为会话变量. 2.以 ...

  4. MySQL存储过程中declare和set定义变量的区别

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

  5. MySQL 存储过程/游标/事务

    将会用到的几个表 mysql> DESC products; +------------+--------------+------+-----+---------+-------------- ...

  6. php调用mysql存储过程游标

    <?php $dbtype = 'mysql'; $host = 'localhost'; $dbname = 'test'; $dsn = "$dbtype:host=$host;d ...

  7. MySQL 存储过程和存储函数 的定义条件和处理程序

    #三.定义条件和处理程序 #mysql 存储函数和过程可以将错误 变成我们想要的处理结果分2步骤 #1.定义错误条件 语法:DECLARE 条件名字 CONDITION for 错误编码 #2. 定义 ...

  8. mysql存储过程游标加计划任务事件调度器

    存储过程加事件调度器 -- 存储过程 (多个)游标的使用 临时表的使用(让执行时间从一个小时降低到5分钟)DELIMITER $$ DROP PROCEDURE IF EXISTS `eval_cal ...

  9. MySQL 存储过程游标

    一.创建游标 游标用declare语句创建.如下面的例子所示: create procedure test2() begin declare cursorTest cursor for select ...

随机推荐

  1. Android——采用SQLiteDatabase操作SQLite数据库

    除了能够使用文件或SharedPreferences存储数据.还能够选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NUL ...

  2. M记单刷鸡盒副本

    今天去M记单刷鸡盒副本,听说此副本掉落最新道具:黑暗之门.鸡翅区和鸡块区全通无压力,鸡腿区难度最大,老一是个灭团点.现在肚子很难受,刚去厕所吐了一把,看来有点高估自己,此副本最好还是组队前往,单刷压力 ...

  3. ACCESS DLL加载错误

    如今还在用ACCESS 2003,太懒没办法,升到2010变化太大了,做个Access的转版挺麻烦的.况且大家都在使用2003,也就懒得搞了. 但问题是office 2003已经out了,(Offic ...

  4. Chrome 常用快捷键

    20160518     生活常识     Chrome常用操作快捷键 掌握Chrome的常用快捷键,不仅可以节约时间,还能够提高工作效率,最主要还可以装逼.以下是一些常用快捷键: 窗口操作快捷键: ...

  5. leetcode Invert Binary Tree python

    # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = ...

  6. SUBSTRING_INDEX ——网上的解释

    SUBSTRING_INDEX(str,delim,count)    Returns the substring from string str before count occurrences o ...

  7. SVN版本控制服务器安装与配置

    版本管理在我们日常学习中一般接触不到,因为我们都是一个人在学习与开发一些练习的项目.但是实际中,一般项目都是协同开发的,这样就需要一个版本管理工具,常见的有SVN/CVS/GitHut等...通过它们 ...

  8. 使用mysql_query()方法操纵数据库以及综合实例

    1.利用insert 语句添加记录 <? require('conn.php'); mysql_query( "insert into lyb ( title, content, au ...

  9. 应用程序缓存 AppCache

    Application Cache HTML5提供了一系列的特性来支持离线应用: application cache localStrorage web SQL & indexed datab ...

  10. windows常用环境变量

    %ALLUSERSPROFILE%列出所有用户Profile文件位置. %APPDATA%列出应用程序数据的默认存放位置. %CD%列出当前目录. %CLIENTNAME%列出联接到终端服务会话时客户 ...