最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL存儲(chǔ)過(guò)程for循環(huán)處理查詢結(jié)果方式

 更新時(shí)間:2026年06月09日 09:46:37   作者:Mr.D.Chuang  
這段文章詳細(xì)介紹了在MySQL數(shù)據(jù)庫(kù)中使用存儲(chǔ)過(guò)程查詢結(jié)果并進(jìn)行循環(huán)處理的方法,涵蓋了創(chuàng)建存儲(chǔ)過(guò)程、聲明游標(biāo)、循環(huán)迭代以及關(guān)閉游標(biāo)等關(guān)鍵步驟,適合數(shù)據(jù)庫(kù)開(kāi)發(fā)人員參考

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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

桐庐县| 随州市| 永泰县| 德兴市| 邹平县| 山东| 波密县| 太仓市| 大竹县| 澄江县| 绥化市| 惠来县| 长阳| 南通市| 永泰县| 抚顺县| 永康市| 泊头市| 吉木乃县| 平潭县| 蚌埠市| 高安市| 房产| 武陟县| 娄底市| 五常市| 隆德县| 肥城市| 博罗县| 牟定县| 乌拉特后旗| 茂名市| 闻喜县| 翁源县| 延安市| 信丰县| 五指山市| 依安县| 新津县| 晋中市| 吉林市|