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

  思考:通常咱们的数据都是存储在数据库里面,对于常规的CRUD操做都是用代码实现,好比使用PHP作项目,全部的数据处理都须要主动操做代码实现。若是咱们如今有一项目,业务须要在用户下单后,对用户的订单进行分润处理,好比在每月的21号,对上个月全部的订单按设置的规则进行分润处理,固然shll脚本也能够实现,可是今天咱们说的是如何经过数据库“存储过程”和“事件”来实现。html

 

1、以下图,是MySQL官网所介绍的https://dev.mysql.com/doc/refman/5.5/en/stored-objects.htmlmysql

  一、简单的理解“存储过程”就是咱们平时写的SQL的集合,里面可能包含IF判断或者posLoop:LOOP循环和咱们平时写PHP代码差很少,就是为了实现某个操做(CRUD);sql

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

  

  二、好比咱们经常使用的Navicat的数据库管理工具,第一个栏目是咱们经常使用的“表”,第三个和第四个就是咱们所说的“存储过程”和“事件”。数组

2、简单的需求。工具

  一、好比咱们有一张表 t_user,须要每2分钟处理一下,若是 type 字段值为 1,则把 num 的值修改成 500。oop

 

   二、新建一个过程spa

   三、具体SQL代码。代码大体说明一下:code

    :SQL里面全部须要用到的变量,都须要先定义,全部咱们先定义了一下三个变量。htm

    :而后建立游标,至关于咱们代码里面先获取数据,获取一个二维数组的 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

  四、建立 “事件”调用写好的过程 p_t3()。调用 存储过程 通常用 CALL + 过程名。

   五、点击保存时,可能提示 “event_scheduler = OFF” 未开启,咱们开启下便可,指令以下。注意,每次重启MySQL后,该值会设为 off 须要从新开启一下。

#开启
SET GLOBAL event_scheduler = ON;
#关闭
SET GLOBAL event_scheduler = OFF;

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

相关文章
相关标签/搜索