MySQL存儲(chǔ)過(guò)程for循環(huán)處理查詢結(jié)果方式
在MySQL數(shù)據(jù)庫(kù)中,存儲(chǔ)過(guò)程是一種預(yù)編譯的SQL語(yǔ)句集,可以被多次調(diào)用。
在MySQL中使用存儲(chǔ)過(guò)程查詢到結(jié)果后,有時(shí)候需要對(duì)這些結(jié)果進(jìn)行循環(huán)處理。
1. 創(chuàng)建表
CREATE TABLE `t_job` ( `job_id` int(11) unsigned NOT NULL AUTO_INCREMENT, `job_name` varchar(50) DEFAULT NULL, `next_time` timestamp NULL DEFAULT NULL COMMENT '下次執(zhí)行時(shí)間', `last_task` int(11) DEFAULT NULL, PRIMARY KEY (`job_id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4; CREATE TABLE `t_task` ( `task_id` int(11) unsigned NOT NULL AUTO_INCREMENT, `start_time` datetime DEFAULT NULL, `end_time` datetime DEFAULT NULL, `status` tinyint(1) DEFAULT NULL, `job_id` int(11) NOT NULL, PRIMARY KEY (`task_id`) ) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8mb4;
2. 存儲(chǔ)過(guò)程查詢結(jié)果
2.1 創(chuàng)建存儲(chǔ)過(guò)程
創(chuàng)建一個(gè)簡(jiǎn)單的存儲(chǔ)過(guò)程來(lái)查詢數(shù)據(jù)
CREATE DEFINER=`root`@`%` PROCEDURE `p_sayn_job`() BEGIN #Routine body goes here... DECLARE v_cnt INT; DECLARE v_job_id INT; SELECT count( 1 ) INTO v_cnt FROM t_job j WHERE j.next_time < SYSDATE(); IF v_cnt > 0 THEN -- 插入數(shù)據(jù) INSERT INTO t_task ( start_time, end_time, STATUS, job_id ) VALUES (SYSDATE(), SYSDATE()+ 1, 1, v_job_id ); -- 更新數(shù)據(jù) UPDATE t_job j SET j.last_task = ( SELECT MAX( t.task_id ) FROM t_task t WHERE t.job_id = j.job_id ), j.next_time = DATE_ADD( j.next_time, INTERVAL 1 DAY ) WHERE j.job_id = v_job_id; END IF; END
2.2 添加for循序語(yǔ)句
DECLARE語(yǔ)句聲明游標(biāo)jobs
-- DECLARE語(yǔ)句聲明游標(biāo) DECLARE jobs CURSOR FOR (SELECT j.job_id FROM t_job j WHERE j.next_time > SYSDATE());
DECLARE語(yǔ)句聲明結(jié)束標(biāo)識(shí)v_finished
-- 聲明變量 DECLARE v_finished int DEFAULT FALSE; -- 結(jié)束標(biāo)識(shí) DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = TRUE;
OPEN語(yǔ)句打開(kāi)游標(biāo)
-- OPEN語(yǔ)句打開(kāi)游標(biāo) OPEN jobs ;
循環(huán)迭代jobs
-- 循環(huán)迭代 jobs read_loop : LOOP END LOOP read_loop;
使用FETCH語(yǔ)句檢索光標(biāo)指向的下一行,并將光標(biāo)移動(dòng)到結(jié)果集中的下一行。
-- 使用FETCH語(yǔ)句檢索光標(biāo)指向的下一行,并將光標(biāo)移動(dòng)到結(jié)果集中的下一行。 FETCH jobs into v_job_id;
使用v_finished變量來(lái)檢查列表是否有id來(lái)終止循環(huán)。
-- 使用v_finished變量來(lái)檢查列表是否有id來(lái)終止循環(huán)。 IF v_finished THEN LEAVE read_loop; END IF;
寫(xiě)入自己的處理業(yè)務(wù)SQl,然后CLOSE語(yǔ)句以停用游標(biāo)并釋放與其關(guān)聯(lián)的內(nèi)存。
-- CLOSE語(yǔ)句以停用游標(biāo)并釋放與其關(guān)聯(lián)的內(nèi)存 CLOSE jobs;
完整的存儲(chǔ)過(guò)程,如下:
CREATE DEFINER=`root`@`%` PROCEDURE `p_sayn_job`() BEGIN#Routine body goes here... DECLARE v_cnt INT; DECLARE v_finished int DEFAULT FALSE; DECLARE v_job_id INT; -- DECLARE語(yǔ)句聲明游標(biāo) DECLARE jobs CURSOR FOR (SELECT j.job_id FROM t_job j WHERE j.next_time > SYSDATE()); -- 結(jié)束標(biāo)識(shí) DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = TRUE; SELECT count( 1 ) INTO v_cnt FROM t_job j WHERE j.next_time < SYSDATE(); IF v_cnt > 0 THEN -- OPEN語(yǔ)句打開(kāi)游標(biāo) OPEN jobs ; -- 循環(huán)迭代 jobs read_loop : LOOP -- 使用FETCH語(yǔ)句檢索光標(biāo)指向的下一行,并將光標(biāo)移動(dòng)到結(jié)果集中的下一行。 FETCH jobs into v_job_id; -- 使用v_finished變量來(lái)檢查列表是否有id來(lái)終止循環(huán)。 IF v_finished THEN LEAVE read_loop; END IF; -- 處理業(yè)務(wù)SQl 就在這了 INSERT INTO t_task ( start_time, end_time, STATUS, job_id ) VALUES ( SYSDATE(), SYSDATE()+ 1, 1, v_job_id ); UPDATE t_job j SET j.last_task = ( SELECT MAX( t.task_id ) FROM t_task t WHERE t.job_id = j.job_id ), j.next_time = DATE_ADD( j.next_time, INTERVAL 1 DAY ) WHERE j.job_id = v_job_id; END LOOP read_loop; -- CLOSE語(yǔ)句以停用游標(biāo)并釋放與其關(guān)聯(lián)的內(nèi)存 CLOSE jobs; END IF; END

2.3 保存執(zhí)行存儲(chǔ)過(guò)程
CALL p_sayn_job();

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Mysql Error 1826:Duplicate foreign key constraint錯(cuò)誤問(wèn)題及解決
- 解決MySQL導(dǎo)入SQL時(shí)報(bào)錯(cuò)1067–Invalid default value for ‘ ’問(wèn)題
- MySQL強(qiáng)制索引中USE/FORCE INDEX用法與避坑
- mysql使用 performance_schema 進(jìn)行性能監(jiān)控
- MySQL中的系統(tǒng)庫(kù)(sys系統(tǒng)庫(kù)、information_schema)調(diào)優(yōu)方法
- MYSQL中information_schema的使用
相關(guān)文章
詳細(xì)解讀分布式鎖原理及三種實(shí)現(xiàn)方式
這篇文章從三種基于不同形式的分布式鎖的實(shí)現(xiàn),數(shù)據(jù)庫(kù)、緩存和zookeeper,內(nèi)容比較詳細(xì),具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10
IOS 數(shù)據(jù)庫(kù)升級(jí)數(shù)據(jù)遷移的實(shí)例詳解
這篇文章主要介紹了IOS 數(shù)據(jù)庫(kù)升級(jí)數(shù)據(jù)遷移的實(shí)例詳解的相關(guān)資料,這里提供實(shí)例幫助大家解決數(shù)據(jù)庫(kù)升級(jí)及數(shù)據(jù)遷移的問(wèn)題,需要的朋友可以參考下2017-07-07
MySQL教程數(shù)據(jù)定義語(yǔ)言DDL示例詳解
這篇文章主要為大家介紹了MySQL教程中什么是數(shù)據(jù)定義語(yǔ)言DDL的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10
mysql開(kāi)啟遠(yuǎn)程連接(mysql開(kāi)啟遠(yuǎn)程訪問(wèn))
開(kāi)啟MYSQL遠(yuǎn)程連接權(quán)限的方法,大家參考使用吧2013-12-12
MySQL數(shù)據(jù)庫(kù)常用命令小結(jié)
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)命令,主要包括對(duì)數(shù)據(jù)庫(kù)常用命令及數(shù)據(jù)庫(kù)中對(duì)表的命令,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
Mysql存儲(chǔ)過(guò)程中游標(biāo)的用法實(shí)例
這篇文章主要介紹了Mysql存儲(chǔ)過(guò)程中游標(biāo)的用法,以商戶關(guān)聯(lián)數(shù)據(jù)的插入及更新為例分析了MySQL存儲(chǔ)過(guò)程中游標(biāo)的使用技巧,需要的朋友可以參考下2015-07-07
MySQL 8.0.0開(kāi)發(fā)里程碑版發(fā)布!
MySQL 8.0.0開(kāi)發(fā)里程碑版發(fā)布,感興趣的小伙伴們可以閱讀一下2016-09-09

