django mysql 游标,MySQL Cursor 存储过程之游标与相关循环
简单介绍游标
在检索出来的行中,前进或者后退一行或多行,就需要用到所谓的“游标”。
游标不是某个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 存储过程之游标与相关循环相关推荐
- mysql 为游标赋值_mysql 存储过程之游标
游标按我的理解就是用在sql编程中对查询结果集的解析,类比jdbc中的resultset对象.FETCH 一行游标指针就往下面移动一行,直到所有行被遍历完成. 游标的使用分为4步: 1.定义游标,指定 ...
- mysql自定义函数、存储过程、游标、触发器、事件(定时任务)
创建函数FUN_GET_ORG_CHILD(rootId) CREATE FUNCTION `FUN_GET_ORG_CHILD`(rootId varchar(100))RETURNS varcha ...
- mysql的游标处理_mysql 存储过程、游标及逐行处理的配合使用
1. 数据准备 +----+------+--------+ | id | name | price1 | +----+------+--------+ | 1 | 大米 | 5 | | 2 | 鸡蛋 ...
- oracle存储过程游标调用,oracle存储过程调用游标例子-Oracle
oracle存储过程调用游标例子. 1:首先你需要创建一个包,并定义你返回的游标的类型.存储过程 create or replace package TEST_PKG is --定义游标 type t ...
- Oracle存储过程以及游标嵌套实际使用
Oracle数据库,存储过程以及游标嵌套实际使用 Oracle对存储过程嵌套游标的使用 这学期新开的Oracle的课程,但是无奈课本是很浅显的东西,内容比较少,以至于老师布置的作业有一些难度,需要参考 ...
- MySQL存储过程使用游标循环数据列表
本篇文章主要讲解,我的一个案例,使用存储过程和游标循环数据列表,并且做一些操作,比如保存一些数据,修改一些数据: 1.需求? MySQL使用存储过程循环数据列表? 2.先描述下MySQL有哪些循环的语 ...
- MySQL存储过程和游标
MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就是为以后的 ...
- mysql游标表间数据迁移_MySQL存储过程--通过游标遍历和异常处理迁移数据到历史表...
-- 大表数据迁移,每天凌晨1点到5点执行,执行间隔时间10分钟,迁移旧数据到历史表.DELIMITER $$ USE `dbx`$$ DROP PROCEDURE IF EXISTS `pro_xx ...
- mysql begin end 用法_MySQL ------ 游标(CURSOR)(二十六)
MySQL执行检索操作会返回一组称为结果集的行,这组返回的行都是与SQL 语句相匹配的行(零行或多行),但是,使用简单的select 语句,没有办法得到第一行.下一行.或前十行,也不存在一行地处理所有 ...
最新文章
- PAT Basic 1072
- dma接收双缓存 stm32_容易被大多数人忽视的STM32串口DMA问题
- 第二单元linux系统
- css 波纹扩散_html5 +css3 点击后水波纹扩散效果 兼容移动端
- 纯c语言实现动态分配多维数组的方法
- 8.2设备文件及磁盘分区
- Java面试必问JVM调优,那.NET5呢?
- TCP/IP、Http的区别
- 《大道至简》阅读笔记02
- 8、QuickExec命令行的使用
- 数据分析常用的7大思维方法详解
- c语言二叉树链式存储,C语言 二叉树的链式存储实例
- 哈理工oj 1006 River Hopscotch
- 远程计算机上不接受445端口,服务器禁止远程445端口
- 没有对手的人生是孤单的
- GB2312编码的字符串如何转换为ISO-8859-1编码?
- [Linux] 使用 Wine
- iexplore出错
- 拓嘉辰丰:影响拼多多直通车推广效果的因素有哪些?
- mysql统计每半小时内的数据(查寻某段时间内的数据)
热门文章
- CSDN 十大技术主题盘点-云原生篇
- Fortinet再获Gartner 2021广域网边缘基础设施魔力象限领导者
- Storm精华问答 | 遇到这些错误日志该如何解决?
- Cloud一分钟 | 苹果更新“隐私页面”;中国联通大数据正式升级,进入数智新阶段...
- mvn install java版本,maven的打包命令--assemblyinstall和maven update之后jdk版本变回1.5的问题...
- mysql有table函数吗_mysql_alter_table函数流程的部分修改和注解
- html dom 知乎,知乎登录页 - 粒子运动效果
- 查看mysql服务的可视化_Prometheus 监控Mysql服务器及Grafana可视化
- Jmeter 使用脚本 生成html测试报告
- SpringBoot2.x整合Swagger2 实现API文档实时生成