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

MySql存儲過程循環(huán)的使用分析詳解

 更新時間:2022年06月29日 11:45:58   作者:生命猿于運動?  
這篇文章主要介紹了MySql存儲過程循環(huán)的使用分析詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下

簡介

每一門數(shù)據(jù)庫語言語法都基本相似,但是對于他們各自的一些特性(函數(shù)、存儲過程等)的用法就不大相同了,就好比OracleMysql存儲過程寫起來就很多不同的地方,在這里主要是跟大家分享一下MySql存儲過程中使用游標(biāo)循環(huán)的處理方法。

場景描述

我們舉一個簡單的場景,首先我們可能會有這樣一種情況,考試成績表(t_achievement)有一堆的sql腳本處理,需要依賴另一個學(xué)生表(t_student)數(shù)據(jù)對部分學(xué)生做考試成績匯總記錄到成績匯總表(t_achievement_report)。

解決方案

  • 有一種方式就是通過代碼優(yōu)先將要匯總的學(xué)生表數(shù)據(jù)獲取出來,然后按成績匯總流程逐個將學(xué)生信息數(shù)據(jù)傳遞到成績匯總業(yè)務(wù)代碼進(jìn)行處理。
  • 另一種方式也是我們今天的主題,那就是通過存儲過程的方式去做。

案例

建表語句:

-- 學(xué)生信息表
DROP TABLE IF EXISTS t_student;
CREATE TABLE `t_student` (
  `id` BIGINT(12) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `code` VARCHAR(10) NOT NULL COMMENT '學(xué)號',
  `name` VARCHAR(20) NOT NULL COMMENT '姓名',
  `age` INT(2) NOT NULL COMMENT '年齡',
  `gender` CHAR(1) NOT NULL COMMENT '性別(M:男,F(xiàn):女)',
  PRIMARY KEY (`id`),
  UNIQUE KEY UK_STUDENT (`code`)
) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- 學(xué)生成績表
DROP TABLE IF EXISTS t_achievement;
CREATE TABLE `t_achievement` (
  `id` BIGINT(12) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `year` INT(4) NOT NULL COMMENT '學(xué)年',
  `subject` CHAR(2) NOT NULL COMMENT '科目(01:語文,02:數(shù)學(xué),03:英語)',
  `score` INT(3) NOT NULL COMMENT '得分',
  `student_id` BIGINT(12) NOT NULL COMMENT '所屬學(xué)生id',
  PRIMARY KEY (`id`) 
) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- 成績匯總表
DROP TABLE IF EXISTS t_achievement_report;
CREATE TABLE `t_achievement_report` (
  `id` BIGINT(12) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `student_id` BIGINT(12) NOT NULL COMMENT '學(xué)生id',
  `year` INT(4) NOT NULL COMMENT '學(xué)年',
  `total_score` INT(4) NOT NULL COMMENT '總分',
  `avg_score` DECIMAL(4,2) NOT NULL COMMENT '平均分',
  PRIMARY KEY (`id`) 
) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

初始化數(shù)據(jù):

INSERT INTO t_student(id, CODE, NAME, age, gender) VALUES
(1, '2022010101', '小張', 18, 'M'),
(2, '2022010102', '小李', 18, 'F'),
(3, '2022010103', '小明', 18, 'M');
INSERT INTO t_achievement(YEAR, SUBJECT, score, student_id) VALUES
(2022, '01', 80, 1),
(2022, '02', 85, 1),
(2022, '03', 90, 1),
(2022, '01', 60, 2),
(2022, '02', 90, 2),
(2022, '03', 98, 2),
(2022, '01', 75, 3),
(2022, '02', 100, 3),
(2022, '03', 85, 3);

存儲過程:

在這里主要以上面的場景為例,使用存儲過程循環(huán)去處理數(shù)據(jù)。寫一個存儲過程,將以上數(shù)據(jù)每個學(xué)生的成績進(jìn)行匯總。

-- 如果存儲過程存在,先刪除存儲過程
DROP PROCEDURE IF EXISTS statistics_achievement;
DELIMITER $$
-- 定義存儲過程
CREATE PROCEDURE statistics_achievement()
BEGIN
        -- 定義變量記錄循環(huán)處理是否完成
	DECLARE done BOOLEAN DEFAULT FALSE;
        -- 定義變量傳遞學(xué)生id
	DECLARE studentid BIGINT(12);
	-- 定義游標(biāo)
	DECLARE cursor_student CURSOR FOR SELECT id FROM t_student;
	-- 定義CONTINUE HANDLER,當(dāng)循環(huán)結(jié)束時 done=true
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=TRUE;
	-- 打開游標(biāo)
	OPEN cursor_student;
	-- 重復(fù)遍歷
	REPEAT 
		-- 每次讀取一次游標(biāo)
		FETCH cursor_student INTO studentid;
                -- 計算總分、平均分插入?yún)R總表
		INSERT INTO t_achievement_report(student_id, `YEAR`, total_score, avg_score)
		SELECT studentid, `YEAR`, SUM(score), ROUND(SUM(score) / 3, 2) FROM t_achievement t1 WHERE student_id = studentid AND NOT EXISTS(
			SELECT 1 FROM t_achievement_report t2 WHERE student_id = studentid AND t1.year = t2.year
		) GROUP BY `YEAR`;
	-- 結(jié)束循環(huán),意思是等到done=true時,結(jié)束循環(huán)REPEAT
	UNTIL done END REPEAT;
	-- 查詢結(jié)果,僅會展示查出的最后一條
	SELECT studentid;
	-- 關(guān)閉游標(biāo)
	CLOSE cursor_student;
END$$
DELIMITER ;
-- 執(zhí)行存儲過程
CALL statistics_achievement();
  • 執(zhí)行結(jié)果,返回查詢結(jié)果3,即最后一條學(xué)生記錄id

總結(jié)

存儲過程也有很強(qiáng)大的功能,如果是一名DBA那么寫存儲過程是分分鐘的事,但是作為一名專做業(yè)務(wù)的碼農(nóng)還是不建議去使用存儲過程寫業(yè)務(wù)代碼。前公司同事適應(yīng)了寫存儲過程,有業(yè)務(wù)改動時不時的直接用存儲過程搞定了,到最后直接就是一大堆堆存儲過程代碼,一個存儲過程下來幾百上千行sql代碼頭都看暈掉,出問題巨難維護(hù),稍有不熟的人員都不敢輕舉妄動,今天在這里也只是為了講解存儲過程中的循環(huán)而舉了個栗子請別介意。

總之我認(rèn)為存儲過程主要還是用來臨時處理一些數(shù)據(jù)方便而用一下,特別有些業(yè)務(wù)改造大,需要做數(shù)據(jù)割接總不能挨個去寫一個業(yè)務(wù)代碼吧。

到此這篇關(guān)于MySql存儲過程循環(huán)的使用分析詳解的文章就介紹到這了,更多相關(guān)MySql存儲過程循環(huán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

遂川县| 丰城市| 江山市| 来凤县| 永定县| 阜新市| 页游| 苏尼特左旗| 松桃| 逊克县| 堆龙德庆县| 武隆县| 马公市| 贡嘎县| 宜州市| 舞钢市| 郑州市| 新建县| 沾益县| 凌海市| 红安县| 沙洋县| 陕西省| 杨浦区| 同德县| 安达市| 嘉祥县| 崇文区| 黄浦区| 江达县| 镇沅| 华阴市| 尼勒克县| 改则县| 瓦房店市| 台江县| 铜山县| 盐源县| 溧阳市| 灌南县| 金乡县|