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 = '日誌_過程執行日誌';
畫重點:
創建臨時表要放在事務控制外、