数据库教程:MySQL数据篇(八)– 存储过程的简单实现

思考:一般我们的数据都是存储在数据库里面,对于常规的CRUD操作都是用代码实现,比如使用PHP做项目,所有的数据处理都需要主动操作代码实现。如果我们现在有一项目,业务需要在用户下单后,对用户的订单进行分润处理,比如在每个月的21号,对上个月所有的订单按设置的规则进行分润处理,当然shll脚本也可以实 …

  思考:一般我们的数据都是存储在数据库里面,对于常规的crud操作都是用代码实现,比如使用php做项目,所有的数据处理都需要主动操作代码实现。如果我们现在有一项目,业务需要在用户下单后,对用户的订单进行分润处理,比如在每个月的21号,对上个月所有的订单按设置的规则进行分润处理,当然shll脚本也可以实现,但是今天我们说的是如何通过数据库“存储过程”和“事件”来实现。

 

一、如下图,是mysql官网所介绍的

  1、简单的理解“存储过程”就是我们平时写的sql的集合,里面可能包含if判断或者posloop:loop循环和我们平时写php代码差不多,就是为了实现某个操作(crud);

    “事件”,就是我们设置的一个自动开关,可以按照我们设置的时间,比如每天12:00或者每分钟处理一次(调用你写的存储过程)。

MySQL数据篇(八)-- 存储过程的简单实现  

  2、比如我们常用的navicat的数据库管理工具,第一个栏目是我们常用的“表”,第三个和第四个就是我们所说的“存储过程”和“事件”。

MySQL数据篇(八)-- 存储过程的简单实现

二、简单的需求。

  1、比如我们有一张表 t_user,需要每2分钟处理一下,如果 type 字段值为 1,则把 num 的值修改为 500。

 MySQL数据篇(八)-- 存储过程的简单实现

   2、新建一个过程

MySQL数据篇(八)-- 存储过程的简单实现

   3、具体sql代码。代码大致说明一下:

    :sql里面所有需要用到的变量,都需要先定义,所有我们先定义了一下三个变量。

    :然后创建游标,相当于我们代码里面先获取数据,获取一个二维数组的 list ,并且把它放在 cur_test 里面,如果游标内容执行完成,就将 done的值设置为 1 。

    :打开游标,相当于开始获取到这个变量。开始循环,相当于我们经常做的 foreach 循环数组操作,先判断下,然后取出游标中的值,赋值给 定义好的变量。相当于我们key 和 value 键名 键值,然后判断满足即修改。

    :最后结束循环的标示和释放游标。

    :可以点击运行,如果没有问题就可以查看是否更改数据,有问题会有提示错误。

begin     #处理t_user如果type = 1,则将num修改为200          #定义变量     declare done int;#定义游标标记     declare t_id int;#定义需要处理的id值     declare t_type int;#定义记录值类型          #创建游标,并存储数据     declare cur_test cursor             for             select id,type from t_user limit 500;          #游标中的内容执行完后将done设置为1     declare continue handler for not found set done = 1;      #打开游标     open cur_test;          #执行循环     posloop:loop              #判断是否结束循环         if    done = 1 then                 leave    posloop;         end if;          #取游标中的值         fetch cur_test into t_id,t_type;                  #如果type = 1,则将num修改为200         if t_type = 1 then                 #执行更新操作                 update t_user set num = 200 where id = t_id;         end if;      #结束循环     end loop posloop;          #释放游标     close cur_test; end

  4、创建 “事件”调用写好的过程 p_t3()。调用 存储过程 一般用 call + 过程名。

MySQL数据篇(八)-- 存储过程的简单实现

   5、点击保存时,可能提示 “event_scheduler = off” 未开启,我们开启下即可,指令如下。注意,每次重启mysql后,该值会设为 off 需要重新开启一下。

#开启 set global event_scheduler = on; #关闭 set global event_scheduler = off;

  最后:只要数据库服务开启,每分钟都会调用一次p_t3(),实现里面的业务规则。第一个简单存储过程加事件的调用,到此为止,至于为什么sql里面这样写,我们往下看我的“mysql实现定时清理过期数据”篇。

需要了解更多数据库技术:MySQL数据篇(八)– 存储过程的简单实现,都可以关注数据库技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/dtteaching/822909.html

(0)
上一篇 2021年9月17日
下一篇 2021年9月17日

精彩推荐