MySQL 存儲過程模板

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 = '日誌_過程執行日誌';

畫重點:

創建臨時表要放在事務控制外、

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章