詳細講解mysql的存儲過程、游標 、事務(wù)
發(fā)表時間:2023-07-24 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]本文主要介紹了mysql的存儲過程、游標 、事務(wù)實例詳解的相關(guān)資料,這里舉實例說明MySQL 存儲過程與游標和事務(wù),需要的朋友可以參考下,希望能幫助到大家。mysql的存儲過程、游標 、事務(wù)實例詳解...
本文主要介紹了mysql的存儲過程、游標 、事務(wù)實例詳解的相關(guān)資料,這里舉實例說明MySQL 存儲過程與游標和事務(wù),需要的朋友可以參考下,希望能幫助到大家。
mysql的存儲過程、游標 、事務(wù)實例詳解
下面是自己曾經(jīng)編寫過的mysql數(shù)據(jù)庫存儲過程,留作存檔,以后用到的時候拿來參考。
其中,涉及到了存儲過程、游標(雙層循環(huán))、事務(wù)。
【說明】:代碼中的注釋只針對當時業(yè)務(wù)而言,無須理會。
代碼如下:
DELIMITER $$
DROP PROCEDURE IF EXISTS `transferEmailTempData`$$
CREATE PROCEDURE transferEmailTempData(IN jobId VARCHAR(24))
BEGIN
DECLARE idval VARCHAR(24) DEFAULT '';
DECLARE taskIdval VARCHAR(24) DEFAULT '';
DECLARE groupIdval VARCHAR(24) DEFAULT '';
DECLARE emailval VARCHAR(50) DEFAULT '';
/*標識正式表是否存在一條相同數(shù)據(jù),即:groupId、email相同*/
DECLARE infoId VARCHAR(24) DEFAULT '';
/*標識事務(wù)錯誤*/
DECLARE err INT DEFAULT 0;
/*達到一定數(shù)量就進行提交,計數(shù)器*/
DECLARE counts INT DEFAULT 0;
/*標識是否回滾過*/
DECLARE isrollback INT DEFAULT 0;
/*游標遍歷時,作為判斷是否遍歷完全部記錄的標記*/
DECLARE done INTEGER DEFAULT 0;
/*獲取臨時表該任務(wù)的數(shù)據(jù)*/
DECLARE cur CURSOR FOR SELECT id,taskId,groupId,email FROM `t_email_data_temp` WHERE taskId=jobId;
/*根據(jù)群組id、email查詢是否存在相同記錄*/
DECLARE cur2 CURSOR FOR SELECT id FROM `t_email_info` e WHERE e.`group_id` = groupIdval AND e.`email_address` = emailval;
/* 出現(xiàn)錯誤,設(shè)置為1,只要發(fā)生異常就回滾*/
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=1;
/*聲明當游標遍歷完全部記錄后將標志變量置成某個值*/
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET done=1;
/*開啟事務(wù)*/
START TRANSACTION;
/*打開游標*/
OPEN cur;
/*使用LOOP循環(huán)遍歷*/
out_loop:LOOP
/*將每一條結(jié)果對應的字段值賦值給變量*/
FETCH cur INTO idval,taskIdval,groupIdval,emailval;
IF done = 1 THEN
LEAVE out_loop;
END IF;
/*打開第二個游標*/
OPEN cur2;
SET done = 0;
FETCH cur2 INTO infoId;
/*如果正式表不存在相同groupId and email記錄,添加到正式表*/
IF done = 1 THEN
/*插入正式表*/
INSERT INTO `t_email_info` VALUES(idval,emailval,groupIdval,0,'',NOW(),'admin',NOW(),'admin');
/*刪除臨時數(shù)據(jù)*/
DELETE FROM `t_email_data_temp` WHERE id = idval;
/*計數(shù)器,每1000條才提交*/
SET counts = counts + 1;
/*發(fā)生異常,回滾*/
IF err=1 THEN
SET isrollback=1;
ROLLBACK;
ELSE
IF counts = 1000 THEN
COMMIT;
/*達到1000條提交后,重置計數(shù)器*/
SET counts=0;
END IF;
END IF;
ELSE
/*已經(jīng)存在相同記錄,則刪除該記錄*/
IF done=0 THEN
DELETE FROM `t_email_data_temp` WHERE id = idval;
END IF;
END IF;
FETCH cur2 INTO infoId;
CLOSE cur2;
/*控制外部的循環(huán),該步驟不能缺少,否則只循環(huán)一次就結(jié)束了*/
SET done=0;
END LOOP out_loop;
CLOSE cur;
/*如果沒有發(fā)生過回滾事件,則更新task狀態(tài)*/
/*如果回滾過,不更新task狀態(tài),下次執(zhí)行任務(wù)的時候,會再次將剩余沒有提交的數(shù)據(jù)進行添加到正式表*/
IF isrollback=0 THEN
UPDATE `t_email_task` t SET t.`if_finish` = 1 WHERE t.`id`=jobId;
END IF;
END$$
DELIMITER ;
相關(guān)推薦:
MySQL存儲過程和事務(wù)的簡單介紹
存儲過程的定義、修改和刪除的操作方法
MySQL存儲過程 游標 錯誤處理的示例代碼
以上就是詳細講解mysql的存儲過程、游標 、事務(wù)的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
學習教程快速掌握從入門到精通的SQL知識。