简单介绍游标

在检索出来的行中,前进或者后退一行或多行,就需要用到所谓的“游标”。

游标不是某个SELECT语句,但是它是被该语句检索出来的结果集。

几个特点:

·MySQL游标只能用于存储过程(和函数)。

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

使用步骤

1. 用DECLARE语句声明一个游标。

在能够使用游标前,必须声明(定义)它。定义要使用的select语句。

DECLARE cursor_name CURSOR FOR SELECT_statement;

2. 使用OPEN语句来打开上面你定义的游标。

一旦声明后,必须打开游标以提供使用。这个过程用前面定义的select语句把数据实际检索出来。

OPEN cursor_name;

3. 用FETCH语句来获得下一行数据。

FETCH是从第一行开始,获取当前行的数据,每次执行后会移动内部行指针,再次调用FETCH则会检索到下一行(不会重复读取同一行)。

FETCH cursor_name INTO variable list;

注意,尤其在循环中不要忘记用Fetch取下一行。

4. 在结束游标使用时,必须关闭游标。

在OPEN时才执行查询,存储检索出的数据以供浏览和滚动。在游标使用完成后,使用CLOSE进行关闭。

CLOSE cursor_name;

在WHILE循环中的使用游标

WHILE语法构造:

while 布尔表达式 do

语句序列;

end while

下面是游标与WHILE循环一起使用的例子。

示例中的 表cur_test1, 表cur_test2结构相同,如下。

(用了与mysql自带的 sakila.country 相同的结构,且往cur_test1 insert了sakila.country的数据:

INSERT INTO cur_test1 SELECT * FROM sakila.country;  )

Create Table: CREATE TABLE `cur_test1` (

`country_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,

`country` varchar(50) NOT NULL,

`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

PRIMARY KEY (`country_id`)

) ENGINE=InnoDB AUTO_INCREMENT=110 DEFAULT CHARSET=utf8

这个例子是把 表cur_test1 中的相应数据copy到 表cur_test2中。

(注意这里仅关注游标cursor与循环的用法)

其他在以下存储过程的SQL的注释中进行了解释。

DELIMITER //

DROP PROCEDURE IF EXISTS cur_while_test;

CREATE PROCEDURE cur_while_test()

BEGIN

DECLARE done int;

DECLARE x_country_id smallint(5);

DECLARE x_country varchar(50);

DECLARE x_last_update timestamp;

/*First: Delcare a cursor,首先这里对游标进行定义*/

DECLARE cur1 CURSOR FOR

SELECT

country_id,

country,

last_update

FROM cur_test1

ORDER BY country_id;

/*when "not found" occur,just continue,这个是个条件处理,针对NOT FOUND的条件*/

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

/*本例适用,本例是insert语句,为可多次执行本存储过程准备的语句*/

TRUNCATE TABLE cur_test2;

SET done = 0;

/*Second: Open the cursor 接着使用OPEN打开游标*/

OPEN cur1;

/*Third: now you can Fetch the row 把第一行数据写入变量中,游标也随之指向了记录的第一行*/

FETCH cur1 INTO x_country_id,

x_country,

x_last_update;

WHILE done = 0 DO

INSERT INTO cur_test2(

country_id,

country,

last_update

)

VALUES(

x_country_id,

x_country,

x_last_update

);

/*抓下一行数据,否则 WHILE done=0 这个条件永远成立,变成无限插入第一行数据的死循环*/

FETCH cur1 INTO x_country_id,

x_country,

x_last_update;

END WHILE;

/*Finally: cursor need be closed 用完后记得用CLOSE把资源释放掉*/

CLOSE cur1;

END

在REPEAT循环中的使用游标

REPEAT语法构造:

repeat

语句序列;

util 布尔表达式

end repeat

下面是游标与REPEAT循环一起使用的例子。

与上面while循环的例子相同,这个例子是把 表cur_test1 中的相应数据copy到 表cur_test2中。

(注意这里仅关注游标cursor与循环的用法)

其他在以下存储过程的SQL的注释中进行了解释。

DELIMITER //

DROP PROCEDURE IF EXISTS cur_repeat_test;

CREATE PROCEDURE cur_repeat_test()

BEGIN

DECLARE done int;

DECLARE x_country_id smallint(5);

DECLARE x_country varchar(50);

DECLARE x_last_update timestamp;

/*First: Delcare a cursor,首先这里对游标进行定义*/

DECLARE cur1 CURSOR FOR

SELECT

country_id,

country,

last_update

FROM cur_test1

ORDER BY country_id;

/*when "not found" occur,just continue,这个是个条件处理,针对NOT FOUND的条件*/

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

/*本例适用,本例是insert语句,为可多次执行本存储过程准备的语句*/

TRUNCATE TABLE cur_test2;

SET done = 0;

/*Second: Open the cursor 接着使用OPEN打开游标*/

OPEN cur1;

/*Third: now you can Fetch the row 把第一行数据写入变量中,游标也随之指向了记录的第一行*/

FETCH cur1 INTO x_country_id,

x_country,

x_last_update;

REPEAT

INSERT INTO cur_test2(

country_id,

country,

last_update

)

VALUES(

x_country_id,

x_country,

x_last_update

);

/*不要忘了抓下一行数据*/

FETCH cur1 INTO x_country_id,

x_country,

x_last_update;

UNTIL done = 1

END REPEAT;

/*Finally: cursor need be closed 用完后记得用CLOSE把资源释放掉*/

CLOSE cur1;

END

django mysql 游标,MySQL Cursor 存储过程之游标与相关循环相关推荐

  1. mysql 为游标赋值_mysql 存储过程之游标

    游标按我的理解就是用在sql编程中对查询结果集的解析,类比jdbc中的resultset对象.FETCH 一行游标指针就往下面移动一行,直到所有行被遍历完成. 游标的使用分为4步: 1.定义游标,指定 ...

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

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

  3. mysql的游标处理_mysql 存储过程、游标及逐行处理的配合使用

    1. 数据准备 +----+------+--------+ | id | name | price1 | +----+------+--------+ | 1 | 大米 | 5 | | 2 | 鸡蛋 ...

  4. oracle存储过程游标调用,oracle存储过程调用游标例子-Oracle

    oracle存储过程调用游标例子. 1:首先你需要创建一个包,并定义你返回的游标的类型.存储过程 create or replace package TEST_PKG is --定义游标 type t ...

  5. Oracle存储过程以及游标嵌套实际使用

    Oracle数据库,存储过程以及游标嵌套实际使用 Oracle对存储过程嵌套游标的使用 这学期新开的Oracle的课程,但是无奈课本是很浅显的东西,内容比较少,以至于老师布置的作业有一些难度,需要参考 ...

  6. MySQL存储过程使用游标循环数据列表

    本篇文章主要讲解,我的一个案例,使用存储过程和游标循环数据列表,并且做一些操作,比如保存一些数据,修改一些数据: 1.需求? MySQL使用存储过程循环数据列表? 2.先描述下MySQL有哪些循环的语 ...

  7. MySQL存储过程和游标

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

  8. mysql游标表间数据迁移_MySQL存储过程--通过游标遍历和异常处理迁移数据到历史表...

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

  9. mysql begin end 用法_MySQL ------ 游标(CURSOR)(二十六)

    MySQL执行检索操作会返回一组称为结果集的行,这组返回的行都是与SQL 语句相匹配的行(零行或多行),但是,使用简单的select 语句,没有办法得到第一行.下一行.或前十行,也不存在一行地处理所有 ...

最新文章

  1. PAT Basic 1072
  2. dma接收双缓存 stm32_容易被大多数人忽视的STM32串口DMA问题
  3. 第二单元linux系统
  4. css 波纹扩散_html5 +css3 点击后水波纹扩散效果 兼容移动端
  5. 纯c语言实现动态分配多维数组的方法
  6. 8.2设备文件及磁盘分区
  7. Java面试必问JVM调优,那.NET5呢?
  8. TCP/IP、Http的区别
  9. 《大道至简》阅读笔记02
  10. 8、QuickExec命令行的使用
  11. 数据分析常用的7大思维方法详解
  12. c语言二叉树链式存储,C语言 二叉树的链式存储实例
  13. 哈理工oj 1006 River Hopscotch
  14. 远程计算机上不接受445端口,服务器禁止远程445端口
  15. 没有对手的人生是孤单的
  16. GB2312编码的字符串如何转换为ISO-8859-1编码?
  17. [Linux] 使用 Wine
  18. iexplore出错
  19. 拓嘉辰丰:影响拼多多直通车推广效果的因素有哪些?
  20. mysql统计每半小时内的数据(查寻某段时间内的数据)

热门文章

  1. CSDN 十大技术主题盘点-云原生篇
  2. Fortinet再获Gartner 2021广域网边缘基础设施魔力象限领导者
  3. Storm精华问答 | 遇到这些错误日志该如何解决?
  4. Cloud一分钟 | 苹果更新“隐私页面”;中国联通大数据正式升级,进入数智新阶段...
  5. mvn install java版本,maven的打包命令--assemblyinstall和maven update之后jdk版本变回1.5的问题...
  6. mysql有table函数吗_mysql_alter_table函数流程的部分修改和注解
  7. html dom 知乎,知乎登录页 - 粒子运动效果
  8. 查看mysql服务的可视化_Prometheus 监控Mysql服务器及Grafana可视化
  9. Jmeter 使用脚本 生成html测试报告
  10. SpringBoot2.x整合Swagger2 实现API文档实时生成