MYSQL数据库的游标(cursor)
2015-11-27 12:33
1636 查看
(4)游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。
概述:游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用 C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。 游标实现了对mysql的存储过程中循环读取数据表中的对象的过程。游标的特性: READ ONLY 只读,只能取值而不能赋值; NOT SCROOLABLE 不可回滚,只能顺序读取; ASENSITIVE 敏感,不能在已经打开游标的表上执行update事务;游标操作:声明游标: DECLARE cursor_name CURSOR FOR select_statement这个语句声明一个光标。也可以在子程序中定义多个光标,但是一个块中的每一个光标必须有唯一的名字。打开游标: OPEN cursor_name游标FETCH:FETCH cursor_name INTO var_name [, var_name] ...这个语句用指定的打开光标读取下一行(如果有下一行的话),并且前进光标指针。关闭游标CLOSE: CLOSE cursor_name这个语句关闭先前打开的光标。如果未被明确地关闭,光标在它被声明的复合语句的末尾被关闭。使用游标的实例:CREATE PROCEDURE curdemo(tblName VARCHAR(100))BEGINDECLARE done INT DEFAULT 0; DECLARE b,c INT; DECLARE cur1 CURSOR FOR SELECT id FROM v_wondyfox; 声明游标DECLARE CONTINUE HANDLER FOR NOT FOUND SET done =1; drop view if exists v_wondyfox ; set @sql=concat("create view v_wondyfox as select * from ", tblName); PREPARE stmt1 FROM @sql;EXECUTE stmt1 ; DEALLOCATE PREPARE stmt1; OPEN cur1; 打开游标REPEAT FETCH cur1 INTO b; 获取游标内容select b; UNTIL done END REPEAT; CLOSE cur1; 关闭游标ENDCREATE PROCEDURE curdemo()BEGIN DECLARE done INT DEFAULT 0; 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 SQLSTATE '02000' SET done = 1; OPEN cur1; OPEN cur2; REPEAT FETCH cur1 INTO a, b; FETCH cur2 INTO c; IF NOT done THEN IF b < c THEN INSERT INTO test.t3 VALUES (a,b); ELSE INSERT INTO test.t3 VALUES (a,c); END IF; END IF; UNTIL done END REPEAT; CLOSE cur1; CLOSE cur2;END
概述:游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用 C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。 游标实现了对mysql的存储过程中循环读取数据表中的对象的过程。游标的特性: READ ONLY 只读,只能取值而不能赋值; NOT SCROOLABLE 不可回滚,只能顺序读取; ASENSITIVE 敏感,不能在已经打开游标的表上执行update事务;游标操作:声明游标: DECLARE cursor_name CURSOR FOR select_statement这个语句声明一个光标。也可以在子程序中定义多个光标,但是一个块中的每一个光标必须有唯一的名字。打开游标: OPEN cursor_name游标FETCH:FETCH cursor_name INTO var_name [, var_name] ...这个语句用指定的打开光标读取下一行(如果有下一行的话),并且前进光标指针。关闭游标CLOSE: CLOSE cursor_name这个语句关闭先前打开的光标。如果未被明确地关闭,光标在它被声明的复合语句的末尾被关闭。使用游标的实例:CREATE PROCEDURE curdemo(tblName VARCHAR(100))BEGINDECLARE done INT DEFAULT 0; DECLARE b,c INT; DECLARE cur1 CURSOR FOR SELECT id FROM v_wondyfox; 声明游标DECLARE CONTINUE HANDLER FOR NOT FOUND SET done =1; drop view if exists v_wondyfox ; set @sql=concat("create view v_wondyfox as select * from ", tblName); PREPARE stmt1 FROM @sql;EXECUTE stmt1 ; DEALLOCATE PREPARE stmt1; OPEN cur1; 打开游标REPEAT FETCH cur1 INTO b; 获取游标内容select b; UNTIL done END REPEAT; CLOSE cur1; 关闭游标ENDCREATE PROCEDURE curdemo()BEGIN DECLARE done INT DEFAULT 0; 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 SQLSTATE '02000' SET done = 1; OPEN cur1; OPEN cur2; REPEAT FETCH cur1 INTO a, b; FETCH cur2 INTO c; IF NOT done THEN IF b < c THEN INSERT INTO test.t3 VALUES (a,b); ELSE INSERT INTO test.t3 VALUES (a,c); END IF; END IF; UNTIL done END REPEAT; CLOSE cur1; CLOSE cur2;END
相关文章推荐
- MYSQL数据库的触发器(trigger)
- MYSQL数据库的视图(view)
- mysql 数据同步 出现Slave_IO_Running:No问题的解决方法小结
- mysql 开启查询缓存方法与查询例子
- MYSQL数据库的索引(index)
- 10003---理解MySQL——复制(Replication)
- Mac上安装MySQL记录
- mysql数据库的备份与还原
- unix时间通过mysql转换出来
- MySql索引算法原理解析(通俗易懂,只讲B-tree)
- Mysql分库分表方案
- mysql bin-log日志过大造成磁盘爆满问题解决。
- mysql杀掉睡眠进程
- mysql常用优化参数
- Ubuntu14.04 mysql 5.5 的中文乱码问题
- mysql分表方法-----MRG_MyISAM引擎分表法
- 线上mysql主从不同步处理
- mysql拼合查询
- mysql innodb压缩pt-online-schema-change
- 安装mysql的时候遇到的坑