mysql 函数 存储过程 事件(event) job 模板

摘要:
CREATEFUNCTION `f_get_Children `(root_idINT)RETURNSvarchar(1000)CHARSETutf8——一些工具,如Navicat;SETctemp=铸造(root_idASHAR);SQLEXCEPTIONSETv_error=TRUE;错误代码;error_ desc;

mysql的编程能力比sqlserver和mysql弱很多,万不得已尽量将这些东西转移到应用层。

but,有时候小项目或项目刚开始尝试阶段,需要降低服务器成本,压缩项目规模。期初业务需求不清晰,也比较简单,为了快速成型也可以先凑合着用。

创建函数模板:

-- ----------------------------
-- Function structure for f_get_childs
-- ----------------------------
DROP FUNCTION IF EXISTS `f_get_childs`;
DELIMITER ;;
CREATE FUNCTION `f_get_childs`(root_id INT) RETURNS varchar(1000) CHARSET utf8
-- 有些工具如Navicat,只需要BEGIN到END这一段,SQLyog需要从DELIMITER到最后
BEGIN
    DECLARE ptemp VARCHAR(1000);
    DECLARE ctemp VARCHAR(1000);
    SET ptemp = '#';
    SET ctemp =CAST(root_id AS CHAR);
    WHILE ctemp IS NOT NULL DO
        SET ptemp = CONCAT(ptemp,',',ctemp);
        SELECT GROUP_CONCAT(canton_id) 
          INTO ctemp 
          FROM sys_canton_info   
         WHERE FIND_IN_SET(parent_id,ctemp)>0; 
    END WHILE;  
    RETURN ptemp;  
END
;;
DELIMITER ;

创建存储过程模板:

-- ----------------------------
-- Procedure structure for p_write_log
-- ----------------------------
DROP PROCEDURE IF EXISTS `p_write_log`;
DELIMITER ;;
CREATE PROCEDURE `p_write_log`(IN p_obj_name varchar(64), IN p_err_desc varchar(255), IN p_sql_err varchar(1000))
BEGIN
  DECLARE v_error BOOL DEFAULT FALSE;
  DECLARE CONTINUE HANDLER FOR SQLWARNING,NOT FOUND, SQLEXCEPTION SET v_error = TRUE;
  START TRANSACTION;
  INSERT INTO sys_log(object_name, error_code, error_desc, trace)
  VALUES (p_obj_name, 'DB-FATAL', LEFT(p_err_desc, 255), LEFT(p_sql_err, 255));
  IF v_error = TRUE THEN
    ROLLBACK;
  ELSE
    COMMIT;
  END IF;
END
;;
DELIMITER ;
-- ----------------------------
-- Procedure structure for p_coupon_cdk_generate
-- ----------------------------
DROP PROCEDURE IF EXISTS `p_coupon_cdk_generate`;
DELIMITER ;;
CREATE PROCEDURE `p_coupon_cdk_generate`(IN r_num bigint)
BEGIN
  DECLARE r_code varchar(32) charset utf8 default '';
  declare r_msg varchar(255) charset utf8 default 'success';
  declare l_count bigint default 0;
  declare l_code varchar(32) charset utf8 default '';
  declare l_counter bigint default 0;
  declare exit handler for sqlexception
    begin
      -- 先把错误取出来
      get diagnostics condition 1 r_code = returned_sqlstate, r_msg = message_text;
      rollback;
      call p_write_log('p_coupon_cdk_generate', concat('存储过程执行异常'),
                       concat('errcode:', ifnull(r_code, 'no-err-code'), ',errmsg:', ifnull(r_msg, 'no-err-msg')));
      select concat(ifnull(r_code, 'no-err-code'), '|', ifnull(r_msg, 'no-err-msg'));
      commit;
    end;
  start transaction;
  label_pro:
  begin
    set l_counter = r_num;
    while l_counter > 0 do
    set l_code = upper(right(MD5(uuid()), 6));
    if length(l_code + 0) = length(l_code) > 0 then --  通过随机的uu_id的MD5来取(纯数字的不要[遇到纯数字,跳出循环,等待下次执行])
      set r_msg = '纯数字,退出';
      leave label_pro;
    end if;
    select count(0) into l_count
    from xy_coupon_cdk t
    where t.cdk = l_code;
    if l_count > 0 then
      set r_msg = '重复的邀请码,退出';
      leave label_pro;
    end if;

    insert into xy_coupon_cdk(cdk)
    values (l_code);

    set l_counter = l_counter - 1;
    end while;
  end;
  commit;
  select concat('流程结束!', r_msg, ',条数:', r_num - l_counter);
END
;;
DELIMITER ;
CREATE PROCEDURE `auto_fans_notify_handler`() 
BEGIN
  DECLARE v_result VARCHAR(100) default "";
  DECLARE v_total_count INT DEFAULT 100;
  declare v_notify_limit int default 3;
  DECLARE v_queue_name VARCHAR(64) default "wx.fans.sync.notify";
  declare l_notify_id varchar(32);
  declare done int default false;
  DECLARE err_code CHAR(5) DEFAULT '00000';
  DECLARE err_msg TEXT;
  
  DECLARE items CURSOR FOR (SELECT t.notify_id
            FROM wx_fans_notify t
           WHERE t.notify_status in (20,30)
             and t.notify_times <= v_notify_limit
             AND t.next_notify_time < NOW()
             AND t.next_notify_time > subdate(NOW(),INTERVAL 1 DAY)
             LIMIT v_total_count);
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN
    -- 先回滚,再保存错误日志
    GET DIAGNOSTICS CONDITION 1 err_code = RETURNED_SQLSTATE, err_msg = MESSAGE_TEXT;
    
    ROLLBACK; -- RollBack之后 error信息就取不到了(FUCK)(所以得先把错误取出来再回滚!!)
    
    CALL wx_p_write_log('auto_fans_notify_handler','执行异常',CONCAT(IFNULL(err_code,'null1'), IFNULL(err_msg,'null2')));
    SELECT CONCAT(IFNULL(err_code,'null1'), IFNULL(err_msg,'null2'));
    COMMIT;    
  END;  
  open items;
    xloop: Loop
      fetch items into l_notify_id;
      if done then
        leave xloop;
      end if;
      
  update wx_fans_notify t
     set t.notify_status    = 30,
         t.notify_times     = t.notify_times + 1,
         t.next_notify_time = adddate(NOW(),interval 5 minute)
   where t.notify_id = l_notify_id
     and t.notify_status in (20,30);
      
  if row_count() > 0 then
     set v_result = wx_f_message_task_create(v_queue_name,concat('{"notify_id":"',l_notify_id,'"}'));
      if (v_result = "success") then
        commit;
      else
        rollback;
      end if;  
  end if;
  end loop xloop;
  close items;
END 

创建事件模板:

mysql 函数 存储过程 事件(event) job 模板第1张mysql 函数 存储过程 事件(event) job 模板第2张
-- ----------------------------
-- Event structure for auto_p_sys_data_clear
-- ----------------------------
DROP EVENT IF EXISTS `auto_p_sys_data_clear`;
DELIMITER ;;
CREATE EVENT `auto_p_sys_data_clear` ON SCHEDULE EVERY 1 HOUR STARTS '2019-09-27 15:29:39' ON COMPLETION PRESERVE ENABLE DO BEGIN
    DECLARE r_code CHAR(5) DEFAULT '00000';
    DECLARE r_msg TEXT CHARACTER SET utf8 DEFAULT '执行成功';
    DECLARE v_obj_name VARCHAR(100) DEFAULT 'p_sys_data_clear';
    DECLARE v_error BOOL DEFAULT FALSE;
    DECLARE v_start_time DATETIME DEFAULT NOW();
    DECLARE v_serial_no VARCHAR(100) DEFAULT CONCAT(v_obj_name, ':', REPLACE(UUID(), '-', ''));
    INSERT INTO `sys_job_log`(`object_name`, start_time, `serial_no`)
    VALUES (v_obj_name, v_start_time, v_serial_no);
    BEGIN
      #异常处理段
      DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
        BEGIN
          SET v_error = TRUE;
          GET DIAGNOSTICS CONDITION 1 r_code = RETURNED_SQLSTATE , r_msg = MESSAGE_TEXT;
        END;
      CALL p_sys_data_clear(); -- 这里将核心逻辑和event分离,event只管定时调度,核心逻辑尽量用存储过程实现
    END;
    -- 相当于记录调度日志
    UPDATE `sys_job_log` t 
       SET t.`status`        = IF(v_error, 90, 0),
           t.`end_time`      = NOW(),
           t.`duration_time` = TIMESTAMPDIFF(SECOND, v_start_time, NOW()),
           t.`result_msg`    = CONCAT(r_code, '|', r_msg)
     WHERE t.`serial_no` = v_serial_no
       AND t.`object_name` = v_obj_name
       AND t.`status` = 30;
  END
;;
DELIMITER ;
示例一
mysql 函数 存储过程 事件(event) job 模板第3张mysql 函数 存储过程 事件(event) job 模板第4张
-- ----------------------------
-- Event structure for auto_p_order_sync
-- ----------------------------
DROP EVENT IF EXISTS `auto_p_order_sync`;
DELIMITER ;;
CREATE EVENT `auto_p_order_sync` ON SCHEDULE EVERY 3 SECOND STARTS '2019-09-27 15:42:25' ON COMPLETION PRESERVE ENABLE DO BEGIN
  DECLARE r_code CHAR(5) DEFAULT '00000';
  DECLARE r_msg TEXT CHARACTER SET utf8 DEFAULT '执行成功';
  DECLARE v_obj_name VARCHAR(100) DEFAULT 'p_order_pool_sync';
  DECLARE v_error BOOL DEFAULT FALSE;
  DECLARE v_start_time DATETIME DEFAULT NOW();
  DECLARE v_serial_no VARCHAR(100) DEFAULT '';
  DECLARE v_step INT DEFAULT 0;
  
  SELECT t.serial_no
    INTO v_serial_no
    FROM sys_job_log t
   WHERE t.object_name = 'p_order_pool_sync'
     AND t.start_time >= CURRENT_DATE()
   ORDER BY t.log_id DESC
   LIMIT 1;
  
  IF v_serial_no IS NULL OR v_serial_no = '' THEN
    SET v_serial_no = CONCAT(v_obj_name, ':', REPLACE(UUID(), '-', ''));
    INSERT INTO `sys_job_log`(`object_name`, start_time, `serial_no`)
    VALUES (v_obj_name, v_start_time, v_serial_no);
  END IF;
  
  BEGIN
    #异常处理段
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
      BEGIN
        SET v_error = TRUE;
        GET DIAGNOSTICS CONDITION 1 r_code = RETURNED_SQLSTATE , r_msg = MESSAGE_TEXT;
      END;
    SET v_step = v_step + 1;
    CALL p_order_goods_sync();
    SET v_step = v_step + 1;
    CALL p_order_recharge_sync();
    SET v_step = v_step + 1;
    CALL p_order_crp_coupon_sync();
  END;
  -- 同示例一
  UPDATE `sys_job_log` t
     SET t.`status`        = IF(v_error, 90, 0),
         t.`end_time`      = NOW(),
         t.`duration_time` = TIMESTAMPDIFF(SECOND, v_start_time, NOW()),
         t.`result_msg`    = CONCAT(v_step, '-', r_code, '|', r_msg)
   WHERE t.`serial_no` = v_serial_no
     AND t.`object_name` = v_obj_name;
END
;;
DELIMITER ;
示例二

关于事件启停,状态的一些SQL:

SHOW VARIABLES LIKE 'event_scheduler';

SHOW GLOBAL VARIABLES LIKE "event_scheduler";

SET GLOBAL event_scheduler=1;

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;

SELECT * FROM wx_message_task;

SHOW ERRORS;

SHOW CREATE event exp_account_sync;

SHOW EVENTS;

-- 开启某事件:
ALTER EVENT e_test ON COMPLETION PRESERVE ENABLE;

-- 关闭某事件:
ALTER EVENT e_test ON COMPLETION PRESERVE DISABLE;

免责声明:文章转载自《mysql 函数 存储过程 事件(event) job 模板》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CSS 画一个心《jQuery权威指南》学习笔记之第2章 jQuery选择器下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

完美的nginx图片防盗链设置详解

一般,我们做好防盗链之后其他网站盗链的本站图片就会全部失效无法显示,但是您如果通过浏览器直接输入图片地址,仍然会显示图片,仍然可以右键图片另存为下载文件!依然可以下载?这样就不是彻底的防盗链了! 1 [root@web01 vhosts]# cat default.conf 2 server { 3 listen 80 default_s...

实现自定义的小程序底部tabbar

背景 诶,当然是为了实现更有温度的代码啦(背后设计师拿着刀对着我) 自带tabbar app.json中配置: tabBar: { backgroundColor: '#fff', borderStyle: 'white', color: '#333', selectedColor: '#333', list: [ {...

[TimLinux] JavaScript BOM浏览器对象模型

1. 简介 ECMAScript是JavaScript的核心,但是如果要在WEB中使用JavaScript,那么BOM则无疑才是真的的核心。BOM提供了很多对象,用于访问浏览器的功能,这些功能与任何网页内容无关。BOM没有标准,各浏览器厂商间定义的公共对象,可以作为事实上的标准存在。W3C在HTML5中把BOM纳入了规范中。 2. window对象 win...

[Matlab] 画信号的CWT,S变换,STFT时频图

先上效果图:  Matlab框架代码: %% Author Information % Author: Guoyang Liu % Email: virter1995@outlook.com % Date: 2019-11-28 (Update 1: 2020-12-14) % Function: Plot CWT and ST and STFT % O...

python发送各类邮件的主要方法

python中email模块使得处理邮件变得比较简单,今天着重学习了一下发送邮件的具体做法,这里写写自己的的心得,也请高手给些指点。     一、相关模块介绍     发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍:    1、smtplib模块       smtplib.SMTP([host[, port[,...

我的第一个油猴脚本--微博超话自动签到

简介 用户脚本是一段代码,它们能够优化您的网页浏览体验。安装之后,有些脚本能为网站添加新的功能,有些能使网站的界面更加易用,有些则能隐藏网站上烦人的部分内容。其中常见的有 油猴插件、ChromeExtentions 由于油猴脚本只用一个JS文档,因而相对于ChromeExtentions比较简单。因此便从油猴脚本开始,首先基本的文件架构是: // ==Us...