028-86922220

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

记一次MySQL存储过程和游标的使用-创新互联

需求:

创新互联主要从事成都网站建设、做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务锦江,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220

  有三张表:Player、Consumption、Consumption_other。Player表中记录用户信息(playerid、origin等字段),Consumption和Consumption_other记录用户的消费信息。现需要根据Player表中的origin字段,分别向Consumption和Consumption_other表中插入一条消费记录。规定:Player表中origin=0的,将信息插入到Consumption表中;Player表中origin不为0的,将信息插入到Consumption_other表中。

方法:

  使用MySQL的存储过程和游标实现:

mysql> DELIMITER // mysql> CREATE PROCEDURE `add_consumption`()     -> BEGIN     ->   -- 定义需要接收游标数据的变量     ->   DECLARE id int(11);     ->   DECLARE origin int(11);     ->   -- 定义遍历数据结束标志     ->   DECLARE done BOOLEAN DEFAULT 0;     ->   -- 定义游标     ->   DECLARE cur CURSOR FOR SELECT     ->     player.playerid as id,     ->     player.origin as origin     ->   FROM player;     ->   -- 将结束标志绑定到游标     ->   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;     ->   -- 打开游标     ->   OPEN cur;     ->     -- 关闭事务自动提交     ->     SET autocommit=0;     ->     -- 开始循环     ->     read_loop:LOOP     ->       -- 提取游标中的数据     ->       FETCH cur INTO id,origin;     ->       -- 声明何时结束循环     ->       IF done THEN     ->         LEAVE read_loop;     ->       END IF;     ->       -- 循环时的事件     ->       IF origin=0     ->       THEN     ->         INSERT INTO consumption VALUES (0,1525467600);     ->       ELSE     ->         INSERT INTO consumption_other VALUES(0,1525467600);     ->       END IF;     ->     END LOOP;     ->     commit;     ->     -- 关闭游标     ->   CLOSE cur;     -> END     -> // mysql> DELIMITER ; mysql> call add_consumption();

存储过程相关:

1、创建存储过程:

   格式:

CREATE PROCEDURE 过程名([参数])   过程体

  例子:

mysql> DELIMITER // mysql> CREATE PROCEDURE `originplayer`(     ->     IN ori int(11),     ->     OUT total int(11)     -> )     -> BEGIN     ->   select count(*) from player where origin=ori into total;     -> END// mysql> DELIMITER ; mysql> call originplayer(0, @total); mysql> select @total; +--------+ | @total | +--------+ |    172 | +--------+

  解析:

2、参数:

  存储过程共有三种参数类型,INT、OUT、INOUT。形式如:CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形...])

3、变量:

DECLARE variable_name datatype [default value];

  datatype与MySQL的数据类型一样,如:int、float、date、varchar(length);

SET variable_name = value

4、查询存储过程:

# 列出所有的存储过程: mysql> show procedure status\G # 列出某个库拥有的存储过程: mysql> select name from mysql.proc where db='project'; # 查询存储过程的详细信息: mysql> show create procedure project.originplayer;

5、删除存储过程:

mysql> drop procedure project.originplayer;

游标相关:

1、创建游标:

mysql> DELIMITER // mysql> CREATE PROCEDURE `getplayerid`()     -> BEGIN     ->   DECLARE id int(11);     ->   DECLARE done BOOLEAN DEFAULT 0;     ->   DECLARE cur CURSOR FOR SELECT     ->     playerid     ->   FROM player;     ->   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;     ->   OPEN cur;     ->     REPEAT     ->       FETCH cur into id;     ->     UTIL done END REPEAT;     ->   CLOSE cur;     -> END// mysql> DELIMITER ;

  解析:

2、DECLARE语句的次序:

  DECLARE语句的发布存在特定的次序。用DECLARE语句定义的局部变量必须在定义任意游标或句柄之前;句柄的定义必须在游标之后。

3、重复或循环:

  除了在1、创建游标中使用的REPEAT外,MySQL还支持循环语句,用来重复执行代码,直到使用LEAVE语句手动退出为止。如下:

    ……     ->     read_loop:LOOP     ->       -- 提取游标中的数据     ->       FETCH cur INTO id,origin;     ->       -- 声明何时结束循环     ->       IF done THEN     ->         LEAVE read_loop;     ->       END IF;     ->       -- 循环时的事件     ->       IF origin=0     ->       THEN     ->         INSERT INTO consumption VALUES (0,1525467600);     ->       ELSE     ->         INSERT INTO consumption_other VALUES(0,1525467600);     ->       END IF;     ->     END LOOP;     ……

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章题目:记一次MySQL存储过程和游标的使用-创新互联
分享URL:http://www.tsicrk.com/article/dhhhoh.html

其他资讯

让你的专属顾问为你服务

2.2507s