记一次MySQL存储过程和游标的使用

发布时间:2020-04-25 22:04:55 作者:zhen1819
来源:网络 阅读:2233

需求:

    有三张表: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;
    ……


推荐阅读:
  1. 记一次僵尸进程的处理
  2. 记一次磁盘故障排查

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql 存储 过程

上一篇:solidity智能合约[19]-for循环

下一篇:PHP float金额在强制转换为整型时,发现数值不对。

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》