mysql實現一個定時刷新用戶登錄記錄的中間庫

做一個 定時刷新用戶登錄記錄的中間庫

存儲過程:
create procedure proc_userlogin()
BEGIN
declare _username varchar(64) default null;
declare _loginTime varchar(64) DEFAULT '1970-01-01 00:00:00';


-- 定義遊標遍歷時,作爲判斷是否遍歷完全部記錄的標記
declare _done interger default 0;

-- 定義遊標名字_cur
declare _cur CURSOR FOR
  select * from tmp_table;  --臨時表在下面定義


-- 聲明當遊標遍歷完全部記錄後將標誌變量設置爲某個值
declare CONTINUE HANDLER FOR NOT FOUND SET _done=1;

-- date爲傳入的參數(這裏傳入當天curdate())
SET @date = DATE_FORMAT(date,'%Y-%m-%d');

-- 定義是否存在當天記錄
SET @count=0;

-- 刪除臨時表
DROP TEMPORARY TABLE IF EXISTS tmp_table;

-- 定義sql
SET @sqlstr = concat('create TEMPORARY TABLE tmp_table(
  select username,loginTime from user
  where
  date_format(loginTime,''%Y-%m-%d'')=''',@date,'''
)
');


-- 預處理需要執行的動態sql,stmt是變量
PREPARE stmt FROM @sqlstr;

-- 執行sql語句
EXECUTE stmt;

-- 釋放預處理段
DEALLOCATE PREPARE stmt;



-- 查看中間庫今天是否有記錄
SET @sqlselect=concat('select count(1) into @count from test.user
where date_format(loginTime,''%Y-%m-%d'')=''',@date,'''
');

PREPARE stmt FROM @sqlselect;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

-- 今天有記錄的話,刪除中間庫今天的登錄記錄
IF @count>0 THEN
  SET @sqldelete=concat('delete from test.user
where date_format(loginTime,''%Y-%m-%d'')=''',@date,'''
');
PREPARE stmt FROM @sqldelete;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;


OPEN _cur; -- 打開遊標

-- 循環語句,逐條把新記錄插入到中間庫
REPEAT
  FETCH _cur
  INTO _username,
  _loginTime ;

INSERT INTO test.user(username,loginTime) values( _username,_loginTime);
-- 提交事務
commit;



UNTIL _done END REPEAT; -- 循環語句結束

-- 關閉遊標
CLOSE _cur;

-- 刪除臨時表
DROP TEMPORARY TABLE IF EXISTS tmp_table;


END




-----------------------------------------------------------------------------
定時事件:
create event user_event
on schedule
EVERY 1 hour
STARTS '2017-09-06 16:00:00'
ON COMPLETION PRESERVE ENABLE
do call proc_userlogin()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章