MySQL 存储过程模板

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangyongze_z/article/details/82623266

mysql 存储过程模板:

CREATE PROCEDURE example.proc_Example()
  SQL SECURITY INVOKER
BEGIN
  #Author: zyz
  #Create: 2018-09-11
  #存储过程示例
  #日志记录定义模块
  DECLARE sys_StartTime datetime;
  DECLARE sys_ErrCode varchar(5) DEFAULT '00000';
  DECLARE sys_ErrMessage varchar(200);
  DECLARE IsSuc tinyint(1);
  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
  BEGIN
    GET DIAGNOSTICS CONDITION 1
    sys_ErrCode = RETURNED_SQLSTATE, sys_ErrMessage = MESSAGE_TEXT;
  END;
  SET sys_StartTime = NOW();

  #创建临时表   
  CREATE TEMPORARY TABLE tm_example(
	ID int, 
	name varchar(50)
  );
 

  #开启事务
  START TRANSACTION;

    #修改隔离级别,防止对业务表过长的共享锁占用
    SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

    #处理数据
    INSERT INTO tm_example(id, name )
      SELECT
        a.id,
        a.name, 
      FROM tb_example a 
        ;
    
    #恢复隔离级别
    SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

    #事务提交/回滚模块
    IF sys_ErrCode <> '00000' THEN
      SET IsSuc = 0;
      ROLLBACK;
    ELSE
      SET IsSuc = 1;
    COMMIT;
  END IF;

  SELECT
    IsSuc;

 #删除临时表
  DROP TEMPORARY TABLE IF EXISTS tm_example;
 
  #日志记录生成模块
  INSERT INTO sys_procedurelog (IsSuccess, Logger, ProcedureName, TimeSpan, ErrCode, ErrMessage, LogTime)
    SELECT
      IsSuc AS IsSuccess,
      'HardwareVB' AS Logger,
      'proc_HardwareVB' AS ProcedureName,
      TIMESTAMPDIFF(SECOND, sys_StartTime, NOW()) AS TimeSpan,
      IF(sys_ErrCode = '00000', NULL, sys_ErrCode) AS ErrCode,
      IF(sys_ErrCode = '00000', NULL, sys_ErrMessage) AS ErrMessage,
      NOW() AS LogTime;

END

存储过程日志表 sys_procedurelog

CREATE TABLE example.sys_procedurelog (
  Id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  IsSuccess tinyint(1) DEFAULT 1 COMMENT '是否成功:0 否;1 是',
  Logger varchar(50) DEFAULT NULL COMMENT '服务名',
  ProcedureName varchar(50) DEFAULT NULL COMMENT '过程名',
  TimeSpan int(11) DEFAULT NULL COMMENT '耗时时长(秒)',
  ErrCode varchar(5) DEFAULT NULL COMMENT '错误代码',
  ErrMessage varchar(200) DEFAULT NULL COMMENT '错误详细信息',
  LogTime datetime DEFAULT NULL COMMENT '日志记录时间',
  PRIMARY KEY (Id),
  INDEX `NON-ProcedureName` (ProcedureName)
)
ENGINE = INNODB
AUTO_INCREMENT = 37813
AVG_ROW_LENGTH = 97
CHARACTER SET utf8
COLLATE utf8_general_ci
COMMENT = '日志_过程执行日志';

画重点:

创建临时表要放在事务控制外、

猜你喜欢

转载自blog.csdn.net/zhangyongze_z/article/details/82623266