久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

mysql的存儲過程、游標 、事務有什么用

170次閱讀
沒有評論

共計 2114 個字符,預計需要花費 6 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

這篇文章給大家分享的是有關 mysql 的存儲過程、游標、事務有什么用的內容。丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考。一起跟隨丸趣 TV 小編過來看看吧。

mysql 的存儲過程、游標、事務實例詳解

下面是自己曾經編寫過的 mysql 數據庫存儲過程,留作存檔,以后用到的時候拿來參考。

其中,涉及到了存儲過程、游標(雙層循環)、事務。

【說明】:代碼中的注釋只針對當時業務而言,無須理會。

代碼如下:

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 
 /* 標識正式表是否存在一條相同數據,即:groupId、email 相同 */
 DECLARE infoId VARCHAR(24) DEFAULT 
 /* 標識事務錯誤 */
 DECLARE err INT DEFAULT 0;
 /* 達到一定數量就進行提交,計數器 */
 DECLARE counts INT DEFAULT 0;
 /* 標識是否回滾過 */
 DECLARE isrollback INT DEFAULT 0;
 /* 游標遍歷時,作為判斷是否遍歷完全部記錄的標記 */
 DECLARE done INTEGER DEFAULT 0;
 /* 獲取臨時表該任務的數據 */
 DECLARE cur CURSOR FOR SELECT id,taskId,groupId,email FROM `t_email_data_temp` WHERE taskId=jobId;
 /* 根據群組 id、email 查詢是否存在相同記錄 */
 DECLARE cur2 CURSOR FOR SELECT id FROM `t_email_info` e WHERE e.`group_id` = groupIdval AND e.`email_address` = emailval; 
 /* 出現錯誤,設置為 1,只要發生異常就回滾 */
 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=1;
 /* 聲明當游標遍歷完全部記錄后將標志變量置成某個值 */
 DECLARE CONTINUE HANDLER FOR NOT FOUND
 SET done=1;
 /* 開啟事務 */
 START TRANSACTION;
 /* 打開游標 */
 OPEN cur;
 /* 使用 LOOP 循環遍歷 */
 out_loop:LOOP
 /* 將每一條結果對應的字段值賦值給變量 */
 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 
 /* 刪除臨時數據 */
 DELETE FROM `t_email_data_temp` WHERE id = idval;
 /* 計數器,每 1000 條才提交 */
 SET counts = counts + 1;
 /* 發生異常,回滾 */
 IF err=1 THEN
 SET isrollback=1;
 ROLLBACK;
 ELSE
 IF counts = 1000 THEN
 COMMIT;
 /* 達到 1000 條提交后,重置計數器 */
 SET counts=0;
 END IF;
 END IF;
 ELSE
 /* 已經存在相同記錄,則刪除該記錄 */
 IF done=0 THEN
 DELETE FROM `t_email_data_temp` WHERE id = idval;
 END IF;
 END IF;
 FETCH cur2 INTO infoId;
 CLOSE cur2;
 /* 控制外部的循環,該步驟不能缺少,否則只循環一次就結束了 */
 SET done=0;
 END LOOP out_loop;
 CLOSE cur;
 /* 如果沒有發生過回滾事件,則更新 task 狀態 */
 /* 如果回滾過,不更新 task 狀態,下次執行任務的時候,會再次將剩余沒有提交的數據進行添加到正式表 */
 IF isrollback=0 THEN
 UPDATE `t_email_task` t SET t.`if_finish` = 1 WHERE t.`id`=jobId;
 END IF;
 END$$
DELIMITER ;

感謝各位的閱讀!關于 mysql 的存儲過程、游標、事務有什么用就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向 AI 問一下細節

丸趣 TV 網 – 提供最優質的資源集合!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-18發表,共計2114字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 卢湾区| 河间市| 涟水县| 健康| 开平市| 噶尔县| 陈巴尔虎旗| 梧州市| 平和县| 乌兰浩特市| 武胜县| 鹤峰县| 武邑县| 邵阳市| 高邑县| 夏津县| 那坡县| 葫芦岛市| 雷波县| 尼勒克县| 吉安县| 获嘉县| 雅江县| 大荔县| 丹巴县| 雅安市| 南雄市| 宁远县| 沾化县| 克什克腾旗| 来凤县| 吕梁市| 辛集市| 南川市| 郴州市| 东港市| 米林县| 芦山县| 延庆县| 永定县| 徐汇区|