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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 8 optional 类,Java8新特性-Optional类

Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。常用方法:Optional.of(T t) : 创建一个 Optional 实例Opt…

java 进度条jsp,jsp进度条_jsp技巧

开始页面:start.jsp状态页面:status.jspJSP进度条setTimeout(“locationstatus.jsp”, 1000);JSP进度条结果: %CELLPADDING0 CELLSPACING2> percent; i - 10) { %> 正在执行完成尚未开始已停止停止页面:stop.jsp业务逻辑bean:TaskBean.javapackage progress;import java.…

覆盖php配置文件,配置 – 用另一个文件覆盖php-fpm池配置值

必须自定义新服务器的php-fpm池配置,我想知道是否有可能/允许/建议有一个新的池文件,该名称在原始文件之后按字母顺序排列,其中只有值覆盖初始配置.原始配置位于/etc/php/7.0/fpm/pool.d,名为www.conf.看来,根据与安装相关的页面,工程师直接修改原件(保存初始值的副本).例如.[w…

子主题function php,php – 带有依赖项的子主题

我正在尝试创建一个儿童主题.父主题有一个style.css和all,我正在查看wp_enqueue_style()函数,它说你可以包含依赖项.这意味着主题自己的style.css可以是活动的,而在我的子主题中,如果我在style.css中指定相同的规则,它应该覆盖它.但依赖是一个句柄数组.我如何找到这些手柄&…

matlab节点导纳阵求逆,关于利用矩阵稀疏技术求解节点导纳矩阵的MATLAB编程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼求大神帮忙看看这个程序,解释一下!%形成节点导纳矩阵%考虑参考节点%考虑互感支路function [d_g,d_b,u_g,u_b]calyy(itoi,noels_hgln,noelsnum_hgln,bs_noels,bs_cp,gb_hgln,gb_noels,gb_cp,lv_bs,lv_hgln,lv…

mysql还原txt表的字段结构,mysql 修改表结构(转)

1.增加一个字段(一列)alter table table_name add column column_name type default value; type指该字段的类型,value指该字段的默认值例如:alter table mybook add column publish_house varchar(10) default ;2.更改一个字段名字(也可以改变类型和默认值)alter table tabl…

python操作json字符串,超详细的Python文件操作知识

来自:CSDN,作者:南枝向暖北枝寒MA链接:https://blog.csdn.net/mall_lucy/article/details/104547365【导语】:python进行文件操作,在日常编程中是很常用的。为了方便大家,这里对各种文件操作的知…

php头尾分离,laravel怎么做模板的头尾分离

关注博主,每天分享项目实战经验1.首先找到页面的公共部分,放在layouts这个目录下的home.blade.php2.设置内容区域yield(content)3.在其他页面使用模板引擎,先继承,然后在使用section即可extends(layouts.home)section(content)I a…

oracle11g备份出错,Oracle 11g备份导入12c错误

Oracle 11g备份导入12c错误Oracle11g:用户名:FJCPP 表空间:FYSOFT_DATA01 临时表空间:FYSOFT_DATA01导入:expdp FJCPP/FJCPP DIRECTORYdump_dir DUMPFILEFJCPP_20190717_1517_137.dmp logfileFJCPP_20190717_1517_137.…

matlab数字图像处理课程设计报告,数字图像处理课程设计实验报告.doc

数字图像处理课程设计实验报告数字图像处理课程设计题 目:数字图像处理及Huufman(或小波变换)编码仿真实现学生姓名:学 院:信息工程学院系 别:电子信息工程系专 业:电子信息工程班 级:电子指导教师&#xf…

oracle大于条件,oracle中sql语句中的in的条件数量大于1000有问题

oracle中sql语句中的in的条件数量大于1000有问题oracle中sql语句中select * from t_Test t where t.Id in(1,2,3......)/*数量不能大于1000个*/解决方法 分割成多次in 然后再或上 如 select * from t_Test t where t.Id in(1,2,3......800) or t.Id in(801,802,803......13…

oracle ora-16003,ORA-31600错误分析

作者:guoge[more]今天在对9i数据库做export时,出现如下错误:E:>exp system/manager filebackbill.dmp ownerbackbillExport: Release 9.2.0.4.0 - Production on Thu Nov 18 14:42:11 2004Copyright (c) 1982, 2002, Oracle Corporation. All rights…

探寻FPGA技术的广泛应用与未来前景

目录 1. FPGA的基础 2. FPGA的工作原理 3. FPGA的优势 3.1 灵活性 3.2 快速开发周期 3.3 高性能 4. FPGA的应用领域 4.1 通信系统 4.2 图像处理 4.3 嵌入式系统 4.4 科学研究 5. FPGA的未来展望 1. FPGA的基础 FPGA,即现场可编程门阵列(Fiel…

oracle元数据到ods,将元数据存储到Jackrabbit存储库中

小编典典对于JCR 2.0,上传文件基本上与对于JCR 1.0而言是相同的。但是,JCR 2.0添加了一些有用的附加内置属性定义。“ nt:file”节点类型旨在表示文件,并且在JCR 2.0中具有两个内置属性定义(这两个属性定义都是在创建节点时由存储…

linux 负载命令,通过Linux命令查看系统平均负载的方法

1、Linux系统的平均负载的概念有时候我们会觉得系统响应很慢,但是又找不到原因,这时就要查看平均负载了,看它是否有大量的进程在排队等待。特定时间间隔内运行队列中的平均进程数可以反映系统的繁忙程度,所以我们通常会在自己的网…

linux 进程调度源码分析,Linux调度器源码分析

代码分析根据3.10版本通过对前面的学习我们知道Linux的调度分为两种周期调度 完成周期性算法参数的更新和系统其它实际的检查主调的 真正的调度过程我们现在来看下主调的的代码框架。入口根《调度发生的情况》的学习,我们知道所有的调度最后都会到 schedule 函数中。…

linux修改端口cost值,Linux下通过修改网卡驱动的参数调整Intel网卡的性能

下面列出paramerter中和性能相关的几个以及他们的取值范围和默认值。InterruptThrottleRate范围:100-100000 (0off, 1dynamic)默认:0注:不支持82542, 82543, 82545, 82544芯片RxDescriptors范围:80-256 for 82542 and 82543-based…

Linux跑齿轮命令,【转】glxgears命令

glxgears是一个测试你的Linux是否可以顺利运行2D、3D的测试软件。这个程序弹出一个窗口,里面有三个转动的齿轮,屏幕将显示出每五秒钟转动多少栅,所以这是一个合理的性能测试。窗户是可以缩放的,栅数多少极大程度上依赖于窗口的大小…

log4j日志 linux配置,Log4j 日志详细用法

简单的说log4j就是帮助开发人员进行日志输出管理的API类库。它最重要的特点就可以配置文件灵活的设置日志信息的优先级、日志信息的输出目的地、日志信息的输出格式Log4j 除了可以记录程序运行日志信息外还有一重要的功能就是用来显示调试信息。程序员经常会遇到脱离Java ide环…