MySQL检所操作返回一组称为结果集的行,游标是一个存储在MySQL服务器上的数据库查询,它不是一条select语句,而是被该语句所检索出来的结果集。只能用于存出过程。
- 声明(定义)游标,这个过程没有实际的检索数据,只是定义使用的select语句。
- 打开游标,用前面定义的select语句把数据检索出来
- 用于填有数据的游标,根据需要检索出各行。
- 游标使用结束时关闭游标。
声明游标
DECLARE cursor_avgScore CURSOR
打开游标
OPEN cursor_avgScore ;
关闭游标
CLOSE cursor_avgScore ;
close使用游标所使用的内部内存和资源,因此游标不使用时要关闭。
一个关闭后的游标不打开不能再次使用,但是一个声明后的游标不需要再次声明,用open打开就可以。
有一个student2表,表中的结构和数据如下: 现在我们需要将student2表中所有学生的的平均成绩(mathScore+englishScore的一半)合成一行,用逗号’,’隔开。
DELIMITER $$ CREATE
PROCEDURE `test`.`procedure_student2`()
BEGIN
-- declare some variable,必须在声明游标和句柄之前,而声明句柄必须在声明游标之后。
DECLARE val DOUBLE DEFAULT 0;
DECLARE tempRes VARCHAR(10) DEFAULT '';
DECLARE res VARCHAR(100) DEFAULT '' ;
-- declare a cursor
DECLARE cursor_avgScore CURSOR
FOR
SELECT (mathScore+englishScore)/2 AS student_avgScore FROM student2;
-- declare a continue handler ,use finish while loop
DECLARE CONTINUE HANDLER FOR SQLSTATE '' SET val= -1.0 ;
-- open cursor
OPEN cursor_avgScore ;
FETCH cursor_avgScore INTO val;
-- fetch cursor
WHILE val!=-1 DO
SET tempRes=CONCAT(val,', ');
SET res=CONCAT(res,tempRes);
FETCH cursor_avgScore INTO val;
END WHILE;
-- close cursor
CLOSE cursor_avgScore ;
-- 显示结果
SELECT res;
END$$ DELIMITER ;
在MySQL中我们还可以用repeat来做
DELIMITER $$ CREATE
PROCEDURE `test`.`procedure_student_v1`()
BEGIN
-- declare some variable,必须在声明游标和句柄之前,而声明句柄必须在声明游标之后。
DECLARE val DOUBLE DEFAULT 0;
DECLARE tempRes VARCHAR(10) DEFAULT '';
DECLARE res VARCHAR(100) DEFAULT '' ;
-- declare a cursor
DECLARE cursor_avgScore CURSOR
FOR
SELECT (mathScore+englishScore)/2 AS student_avgScore FROM student2;
-- declare a continue handler ,use finish while loop
DECLARE CONTINUE HANDLER FOR SQLSTATE '' SET val= -1.0 ;
-- open cursor
OPEN cursor_avgScore ;
-- fetch cursor
REPEAT
FETCH cursor_avgScore INTO val;
IF val!=-1 THEN
SET tempRes=CONCAT(val,', ');
SET res=CONCAT(res,tempRes);
END IF;
UNTIL val=-1 END REPEAT; -- 居然MySQL中 用 val=-1 来结束循环,原以为应该和java、c类似,用val==-1来结束。
-- close cursor
CLOSE cursor_avgScore ;
-- 显示结果
SELECT res;
END$$ DELIMITER ;
MySQL中while,loop,repeat循环
-- MySQL中的三中循环 while 、 loop 、repeat 求 1-n 的和 -- 第一种 while 循环
-- 求 1-n 的和
/* while循环语法:
while 条件 DO
循环体;
end while;
*/
-- 实例:
create procedure sum1(a int)
begin
declare sum int default 0; -- default 是指定该变量的默认值
declare i int default 1;
while i<=a DO -- 循环开始
set sum=sum+i;
set i=i+1;
end while; -- 循环结束
select sum; -- 输出结果
end
-- 执行存储过程
call sum1(100);
-- 删除存储过程
drop procedure if exists sum1 -- 第二种 loop 循环
/*loop 循环语法:
loop_name:loop
if 条件 THEN -- 满足条件时离开循环
leave loop_name; -- 和 break 差不多都是结束训话
end if;
end loop;
*/ -- 实例:
create procedure sum2(a int)
begin
declare sum int default 0;
declare i int default 1;
loop_name:loop -- 循环开始
if i>a then
leave loop_name; -- 判断条件成立则结束循环 好比java中的 boeak
end if;
set sum=sum+i;
set i=i+1;
end loop; -- 循环结束
select sum; -- 输出结果
end
-- 执行存储过程
call sum2(100);
-- 删除存储过程
drop procedure if exists sum2 -- 第三种 repeat 循环
/*repeat 循环语法
repeat
循环体
until 条件 end repeat;
*/ -- 实例;
create procedure sum3(a int)
begin
declare sum int default 0;
declare i int default 1;
repeat -- 循环开始
set sum=sum+i;
set i=i+1;
until i>a end repeat; -- 循环结束
select sum; -- 输出结果
end -- 执行存储过程
call sum3(100);
-- 删除存储过程
drop procedure if exists sum3
MySQL使用游标的更多相关文章
-
MySQL中游标使用以及读取文本数据
原文:MySQL中游标使用以及读取文本数据 前言 之前一直没有接触数据库的学习,只是本科时候修了一本数据库基本知识的课.当时只对C++感兴趣,天真的认为其它的课都没有用,数据库也是半懂不懂,胡乱就考试 ...
-
MySQL存储过程 游标
MySQL存储过程 游标 如何在存储过程中使用MySQL游标来遍历SELECT语句返回的结果集 MySQL游标简介 要处理存储过程中的结果集,请使用游标.游标允许您迭代查询返回的一组行,并相应地处理 ...
-
Mysql 视图 游标 触发器 存储过程 事务
Mysql 视图 触发器 存储过程 游标 游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中 ...
-
MySql使用游标Cursor循环(While)更新数据
#要修改的变量 DECLARE var_ID VARCHAR(50) DEFAULT ''; #需要修改的数据的数量 DECLARE var_UpdateCount INT; #当前循环次数 DECL ...
-
MySql 中游标,事务,终止存储过程方法总结
最近在项目开发中,有段逻辑处理,需要在网站,app,后台分别运行,这样给后期的维护带来了很大的不方便,容易遗漏app端或者后台,所以讲java代码转换成存储过程,把逻辑处理写在了mysql端,其中遇到 ...
-
用 Navicat 写mysql的游标
千言万语也比不上一个简单直接明了的小例子: CREATE PROCEDURE pro_users() begin DECLARE myid int; DECLARE no int; ); ); ); ...
-
【MySQL】游标的具体使用详解
测试表 level ; )); 再 insert 些数据 ;代码,初始化 drop procedure if exists useCursor // 建立 存储过程 create CREATE PRO ...
-
mysql之游标
游标 行,也不存在每次一行地处理所有行的简单方法(相对于成批地处理它们).有时,需要在检索出来的行中前进或后退一行或多行.这就是使用游标的原因.游标( cursor)是一个存储在MySQL服务器上的数 ...
-
MySql命令——游标
1.游标的概念 有时,需要在检索出来的行中前进或后退一行或多行.这就是使用游标的原因.游标(cursor)是一个存储在 MySql 服务器上的数据库查询,它不是一条 select 语句,而是被该语句检 ...
-
mysql 简单游标
<=====================MYSQL 游标示例=====================> CREATE PROCEDURE `test`.`new_procedure` ...
随机推荐
-
Java实现画八卦
八卦是由多个圆叠加而成,如果我们让每个圆都有自己的颜色,那么具体结构便一目了然,如下图所示: 显然只要令对应的圆颜色相同,就能达到我们预期的效果. 用Java就能轻松画出来: import java. ...
-
C# .Net中七层架构浅析
Model实体层,DBUtility数据访问抽象类,IDAL数据访问接口层,SQLServerDAL数据访问层,DALFactory数据访问工厂类,BLL业务逻辑层,UI界面层 一.项目名称及描述:( ...
-
LeetCode——Valid Sudoku
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...
-
mac 下有些工具 app 推荐
打开推荐报价mac在工具app Evernote的 Evernote的贬值,课堂笔记软件,其主要功能是记录笔记,假设你想,它可用于使todo list, 甚至gtd, 或收集的知识归纳 Doit.im ...
-
10.hibernate缓存机制详细分析(转自xiaoluo501395377)
hibernate缓存机制详细分析 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论 ...
-
UpdateData使用说明
UpdateData() MFC的窗口函数,下面是MSDN的说明: Call this member function to initialize data in a dialog box, or t ...
-
[转] .NET领域驱动设计—初尝(原则、工具、过程、框架)
阅读目录: 1.原则 1.1.精简聚合 1.2.分离用例与接口功能(设计模式的用武之地) 2.工具.框架.组件 3.过程 1]原则 原则对于任何一项技术实现来说都是至关重要的,在设计某一个系统功能的时 ...
-
PLSql的使用
1.安装 plsqldeveloper和数据库驱动-ODAC 2.在数据库驱动ODAC中添加 Oracle客户端的网络服务名配置文件tnsnames.ora 路径为: 3.汉化 直接运行Languag ...
-
AD域部署使用bginfo软件
实验网络拓扑图: 实验目标: bginfo收集信息服务器通过bginfo软件收集每个域客户端信息录入到SQL server 2008数据库 bginfo软件官网下载地址: https://docs.m ...
-
hihocoder #1076 与链 dp
直接背包不可做 我们只需要知道每个数位上有多少个$1$,那么我们就能构造出解 因此,我们对每一位讨论, 可以拆出$n + \frac{n}{2} + \frac{n}{4} + ... = 2n$个物 ...