zoukankan      html  css  js  c++  java
  • Mysql 游标的定义与使用方式

    创建游标:

    首先在MySql中创建一张数据表:

    CREATE TABLE IF NOT EXISTS `store` (  

    `id` int(11) NOT NULL AUTO_INCREMENT,  

    `name` varchar(20) NOT NULL,  

    `count` int(11) NOT NULL DEFAULT '1',

    PRIMARY KEY (`id`)  

    ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7; 

    INSERT INTO `store` (`id`, `name`, `count`) VALUES  

    (1, 'android', 15),  

    (2, 'iphone', 14),  

    (3, 'iphone', 20),  

    (4, 'android', 5),  

    (5, 'android', 13),  

    (6, 'iphone', 13)
    我们现在要用存储过程做一个功能,统计iphone的总库存是多少,并把总数输出到控制台。

    --在windows系统中写存储过程时,如果需要使用declare声明变量,需要添加这个关键字,否则会报错。  

    delimiter // 

    drop procedure if exists StatisticStore; 

    CREATE PROCEDURE StatisticStore()  

    BEGIN

    --创建接收游标数据的变量

    declare c int;

    declare n varchar(20);

    --创建总数变量

    declare total int default 0;

    --创建结束标志变量

    declare done int default false;

    --创建游标

    declare cur cursor for select name,count from store where name = 'iphone';

    --指定游标循环结束时的返回值

    declare continue HANDLER for not found set done = true;

    --设置初始值

    set total = 0;

    --打开游标

    open cur;

    --开始循环游标里的数据

    read_loop:loop

    --根据游标当前指向的一条数据

    fetch cur into n,c;

    --判断游标的循环是否结束

    if done then

    leave read_loop; --跳出游标循环

    end if;

    --获取一条数据时,将count值进行累加操作,这里可以做任意你想做的操作,

    set total = total + c;

    --结束游标循环

    end loop;

    --关闭游标

    close cur;

    --输出结果 

    select total;

    END;

    -调用存储过程 

    call StatisticStore();

    fetch是获取游标当前指向的数据行,并将指针指向下一行,当游标已经指向最后一行时继续执行会造成游标溢出。
    使用loop循环游标时,他本身是不会监控是否到最后一条数据了,像下面代码这种写法,就会造成死循环;

    read_loop:loop  

    fetch cur into n,c;  

    set total = total+c;  

    end loop; 

    在MySql中,造成游标溢出时会引发mysql预定义的NOT FOUND错误,所以在上面使用下面的代码指定了当引发not found错误时定义一个continue 的事件,指定这个事件发生时修改done变量的值。
    declare continue HANDLER for not found set done = true; 

    所以在循环时加上了下面这句代码。

    --判断游标的循环是否结束  

    if done then  

    leave read_loop;    --跳出游标循环 

    end if;

    如果done的值是true,就结束循环。继续执行下面的代码。
     
     
     
     
  • 相关阅读:
    BZOJ3745 / SP22343 NORMA2
    Luogu P4169 [Violet]天使玩偶/SJY摆棋子
    Luogu P3170 [CQOI2015]标识设计 状态压缩,轮廓线,插头DP,动态规划
    CQOI2013 棋盘游戏
    HAOI2008 硬币购物
    九省联考2018 一双木棋
    Codeforces Round #560 Div. 3
    算法竞赛入门经典 写题笔记(第五章 图论算法与模型4)
    算法竞赛入门经典 写题笔记(第五章 图论算法与模型3)
    算法竞赛入门经典 写题笔记(第五章 图论算法与模型2)
  • 原文地址:https://www.cnblogs.com/jack1989/p/8042317.html
Copyright © 2011-2022 走看看