drop procedure p12$ //删除存储过程

//游标cursor,一条sql对应n条资源,取出资源的接口/句柄就是cursor,  一条sql产生的n条结果不是一次性全部输出,而是返回一个地址,然后一个个的筛选。

//声明游标(declare),打开游标(open),打开游标就去数据库查询资源了,查到了并不是把所有的结果行返回给你,而是给你一个口,然后就可以去fetch(取值),最后close游标。

mysql> delimiter $
create procedure p13()
begin
declare row_gid int;
declare row_num int;
declare row_name varchar(20); //声明3个变量,存储fetch得到的每一行的3个列的值 declare getgoods cursor //声明游标,此时的游标是一个地址,如果查询为空则getgoods就是null,
for select gid,num,name from goods; //游标作用的语句
open getgoods; //打开游标
fetch getgoods //fetch一次就得到一行
into row_gid,row_num,row_name; //一一对应赋值 select row_num,row_name; //显示出来看
close getgoods; //关闭游标
end$ mysql> call p13()$
+---------+----------+
| row_num | row_name |
+---------+----------+
| 222 | 猫 |
+---------+----------+ mysql> delimiter $
create procedure p14()
begin
declare row_gid int;
declare row_num int;
declare row_name varchar(20); declare getgoods cursor for select gid,num,name from goods;
open getgoods; fetch getgoods into row_gid,row_num,row_name; //相同的语句每取一次,往后移动一次,
select row_num,row_name; fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name; fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name; fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name; close getgoods;
end$ mysql> call p14()$
+---------+----------+
| row_num | row_name |
+---------+----------+
| 222 | 猫 |
+---------+----------+
1 row in set +---------+----------+
| row_num | row_name |
+---------+----------+
| 333 | 马 |
+---------+----------+
1 row in set +---------+----------+
| row_num | row_name |
+---------+----------+
| 555 | 猪 |
+---------+----------+
1 row in set delimiter $
create procedure p16()
begin
declare totalcunt int default 0;//总行数
declare i int default 0; declare row_gid int;
declare row_num int;
declare row_name varchar(20); declare getgoods cursor for select gid,num,name from goods; //declare要放在一起写完,再写select语句
select count(*) into totalcunt from goods; open getgoods; repeat //可以在repeat中对每一行做处理
set i:=i+1;
fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;
until i >= totalcunt end repeat; close getgoods;
end$ mysql> call p16()$
+---------+----------+
| row_num | row_name |
+---------+----------+
| 222 | 猫 |
+---------+----------+
1 row in set +---------+----------+
| row_num | row_name |
+---------+----------+
| 333 | 马 |
+---------+----------+
1 row in set //游标越界时标志,在mysql cursor 中可以declare continue handler来操作是否越界,declare continue handler for NOT FOUND set ....声明continue handler专门监控没有数据事件时执行语句, delimiter $
create procedure p17()
begin
declare row_gid int;
declare row_num int;
declare row_name varchar(20); declare outrange int default 1;//越界标志,为0时就没有了 declare getgoods cursor for select gid,num,name from goods; //声明游标,返回的是select的结果集的首地址, declare continue handler for NOT FOUND set outrange:=0;//声明句柄,没有数据事件发生时,执行设置outrange为0, open getgoods; repeat //可以在repeat中对每一行做处理
fetch getgoods into row_gid,row_num,row_name; //取一行
select row_num,row_name; //输出fetch到的哪一行
until outrange= 0 end repeat; close getgoods;
end$ mysql> call p17()$ //多取了一行,
+---------+----------+
| row_num | row_name |
+---------+----------+
| 222 | 猫 |
+---------+----------+
1 row in set +---------+----------+
| row_num | row_name |
+---------+----------+
| 666 | uuu |
+---------+----------+
1 row in set +---------+----------+
| row_num | row_name |
+---------+----------+
| 666 | uuu |
+---------+----------+
1 row in set repeat
fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;
until outrange= 0 end repeat;
//最后一个fetch--->没数据--->outrange=0--->因为声明的是一个continue handle,继续执行后面的sql语句,select row_num,row_name; --->因此最后一行取出2次
//如果NOT FOUND事件发生后,select不再执行就好了。声明handler不是continue而是exit就好了。 declare exit handler for NOT FOUND set outrange:=0; //就好了
//exit与continue的区别:exit触发后后面的语句不在执行。除了continue和exit还有undo handler,
//continue是触发后后面的语句继续执行
//exit是出发后后面的语句不执行
//undo 是触发后前面的语句撤销,但是mysql不支持。 //就用continue同时还不取出最后一行,游标终极版本。
delimiter $
create procedure p20()
begin
declare row_gid int;
declare row_num int;
declare row_name varchar(20); declare outrange int default 1; declare getgoods cursor for select gid,num,name from goods; declare continue handler for NOT FOUND set outrange:=0; open getgoods;
fetch getgoods into row_gid,row_num,row_name; //先取出一行,防止第一行就是空的
repeat
select row_num,row_name; //输出fetch到的那行,
fetch getgoods into row_gid,row_num,row_name; //fetch最后一行的下一行的时候,NOT FOUND事件触发,继续执行的是until outrange= 0 不会多取出最后一行,
until outrange= 0
end repeat; close getgoods;
end$ //游标终极版本。
delimiter $
create procedure p23()
begin
declare row_gid int;
declare row_num int;
declare row_name varchar(20); declare outrange int default 1; declare getgoods cursor for select gid,num,name from goods; declare continue handler for NOT FOUND set outrange:=0; open getgoods;
fetch getgoods into row_gid,row_num,row_name;
while outrange=1 do //repeat相当于do while,
select row_num,row_name;
fetch getgoods into row_gid,row_num,row_name;
end while; close getgoods;
end$

mysql05---游标的更多相关文章

  1. 用游标实现查询当前服务器所有数据库所有表的SQL

    declare @name varchar(100) DECLARE My_Cursor CURSOR --定义游标 FOR (SELECT Name FROM Master..SysDatabase ...

  2. 使用rowid抽取数据方法以及大数据量游标卡住的应对

    平时工作的时候,经常会遇到这种事情,从一个大表A中,抽取字段a在一个相对较小B的表的数据,比如,从一个详单表中,抽取几万个用户号码的话单出来.这种时候,一般来说, 做关联查询: create tabl ...

  3. Mysql - 游标/动态sql/事务

    游标这个在我目前的项目里面用的还不多, 但是其功能还是很强大的. 动态sql以前都没用过, 是跟着富士康(不是张全蛋的富土康哦)过来的同事学的. 还是挺好用的. 我的数据库方面, 跟他学了不少. 在此 ...

  4. SQL Server 游标运用:鼠标轨迹字符串分割

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 游标模板(Cursor Template) 鼠标轨迹字符串分割SQL脚本实现(SQL Code ...

  5. 读书笔记--SQL必知必会21--使用游标

    21.1 游标 结果集(result set),SQL查询说检出的结果. 游标(cusror),是一个存储在DBMS服务器上的数据库查询. 游标不是一条SELECT语句,而是被该句检索出来的结果集. ...

  6. sqlserver 游标的使用

    declare @temp_temp uniqueidentifier--临时变量 DECLARE aaa CURSOR for select Id from A ------------------ ...

  7. MySQL动态游标

    通过(准备语句+视图+静态游标)实现 -- 建立测试表和数据 create table webuser (username varchar(10)); insert into webuser valu ...

  8. SQL Server游标(转)

    清晰地介绍了SQL游标,很好的学习资料. 转自 http://www.cnblogs.com/knowledgesea/p/3699851.html 什么是游标 结果集,结果集就是select查询之后 ...

  9. ABAP游标的使用

    在Oracle,SQLServer中游标的使用是经常的,所以在ABAP不懂是不行的......     1.声明游标 OPEN CURSOR [WITH HOLD] <c> FOR SEL ...

  10. Sybase_游标

    本章将介绍如何在Sybase下使用游标 因业务需要,要批量处理一些数据,sql需要用到循环,所以要使用游标,我写了一个简单的游标,sql如下 DECLARE my_Cursor CURSOR FOR ...

随机推荐

  1. Milk(sort+结构体)

    Description Ignatius drinks milk everyday, now he is in the supermarket and he wants to choose a bot ...

  2. Android Ubuntu 12.04 源码环境搭建

    $ sudo apt-get install git gnupg flex bison gperf build-essential \ zip curl libc6-dev libncurses5-d ...

  3. [codeforces551E]GukiZ and GukiZiana

    [codeforces551E]GukiZ and GukiZiana 试题描述 Professor GukiZ was playing with arrays again and accidenta ...

  4. [POJ2446] Chessboard(二分图最大匹配-匈牙利算法)

    传送门 把所有非障碍的相邻格子彼此连一条边,然后求二分图最大匹配,看 tot * 2 + k 是否等于 n * m 即可. 但是连边不能重复,比如 a 格子 和 b 格子 相邻,不能 a 连 b ,b ...

  5. [luoguP1186] 玛丽卡(spfa)

    传送门 因为要随机删除一条边,而枚举所有边肯定会超时,经过发现,先求出一遍最短路,而要删除的边肯定在最短路径上,删除其他的边对最短路没有影响. 所以可以先求出最短路,再枚举删除最短路上的每一条边再求最 ...

  6. 使用Sencha Architect开发Sencha Touch应用的整理

    官网:http://www.sencha.com/ 其实官网上的文档都很清楚了,不过整理一下总比较好 第一步,软件准备 注: 以下软件的安装本着这样两条原则 一是不要安装在中文目录下 二是不要安装在带 ...

  7. unbuntu下安装多个JAVA JDK版本及如何切换

    当前环境已经安装过jdk1.6.0_45安装JDK 1.7.x时,若安装错误,可执行以下步骤:sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-ge ...

  8. SSH日志位置

    # Redhat or Fedora Core: /var/log/secure # Mandrake, FreeBSD or OpenBSD: /var/log/auth.log # SuSE: / ...

  9. BZOJ1744: [Usaco2005 oct]Skiing 奶牛滑雪

    n<=100 * m<=100的地图,每个数绝对值不超过25,从1,1到n,m,一开始速度v,从数字A走到数字B速度会变成v*2^(A-B),求到终点最短时间. 可以发现,相同的数字出发的 ...

  10. as3 二维数组的定义

    大家都知道as3里面是不能直接定义多维数组 所以不能直接用arr[2][3]这样的方法来获取数组里面的值.如何才能创立多维数组了? 方法如下先定义一个数组 var MapData:Array=new ...