MySQL存儲(chǔ)過程for循環(huán)處理查詢結(jié)果方式
在MySQL數(shù)據(jù)庫中,存儲(chǔ)過程是一種預(yù)編譯的SQL語句集,可以被多次調(diào)用。
在MySQL中使用存儲(chǔ)過程查詢到結(jié)果后,有時(shí)候需要對這些結(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ǔ)過程查詢結(jié)果
2.1 創(chuàng)建存儲(chǔ)過程
創(chuàng)建一個(gè)簡單的存儲(chǔ)過程來查詢數(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循序語句
DECLARE語句聲明游標(biāo)jobs
-- DECLARE語句聲明游標(biāo) DECLARE jobs CURSOR FOR (SELECT j.job_id FROM t_job j WHERE j.next_time > SYSDATE());
DECLARE語句聲明結(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語句打開游標(biāo)
-- OPEN語句打開游標(biāo) OPEN jobs ;
循環(huán)迭代jobs
-- 循環(huán)迭代 jobs read_loop : LOOP END LOOP read_loop;
使用FETCH語句檢索光標(biāo)指向的下一行,并將光標(biāo)移動(dòng)到結(jié)果集中的下一行。
-- 使用FETCH語句檢索光標(biāo)指向的下一行,并將光標(biāo)移動(dòng)到結(jié)果集中的下一行。 FETCH jobs into v_job_id;
使用v_finished變量來檢查列表是否有id來終止循環(huán)。
-- 使用v_finished變量來檢查列表是否有id來終止循環(huán)。 IF v_finished THEN LEAVE read_loop; END IF;
寫入自己的處理業(yè)務(wù)SQl,然后CLOSE語句以停用游標(biāo)并釋放與其關(guān)聯(lián)的內(nèi)存。
-- CLOSE語句以停用游標(biāo)并釋放與其關(guān)聯(lián)的內(nèi)存 CLOSE jobs;
完整的存儲(chǔ)過程,如下:
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語句聲明游標(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語句打開游標(biāo) OPEN jobs ; -- 循環(huán)迭代 jobs read_loop : LOOP -- 使用FETCH語句檢索光標(biāo)指向的下一行,并將光標(biāo)移動(dòng)到結(jié)果集中的下一行。 FETCH jobs into v_job_id; -- 使用v_finished變量來檢查列表是否有id來終止循環(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語句以停用游標(biāo)并釋放與其關(guān)聯(lián)的內(nèi)存 CLOSE jobs; END IF; END

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

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

