<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
每一門資料庫語言語法都基本相似,但是對於他們各自的一些特性(函數、儲存過程等)的用法就不大相同了,就好比Oracle
與Mysql
儲存過程寫起來就很多不同的地方,在這裡主要是跟大家分享一下MySql
儲存過程中使用遊標迴圈的處理方法。
我們舉一個簡單的場景,首先我們可能會有這樣一種情況,考試成績表(t_achievement
)有一堆的sql指令碼處理,需要依賴另一個學生表(t_student
)資料對部分學生做考試成績彙總記錄到成績彙總表(t_achievement_report
)。
建表語句:
-- 學生資訊表 DROP TABLE IF EXISTS t_student; CREATE TABLE `t_student` ( `id` BIGINT(12) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `code` VARCHAR(10) NOT NULL COMMENT '學號', `name` VARCHAR(20) NOT NULL COMMENT '姓名', `age` INT(2) NOT NULL COMMENT '年齡', `gender` CHAR(1) NOT NULL COMMENT '性別(M:男,F:女)', PRIMARY KEY (`id`), UNIQUE KEY UK_STUDENT (`code`) ) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- 學生成績表 DROP TABLE IF EXISTS t_achievement; CREATE TABLE `t_achievement` ( `id` BIGINT(12) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `year` INT(4) NOT NULL COMMENT '學年', `subject` CHAR(2) NOT NULL COMMENT '科目(01:語文,02:數學,03:英語)', `score` INT(3) NOT NULL COMMENT '得分', `student_id` BIGINT(12) NOT NULL COMMENT '所屬學生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 '學生id', `year` INT(4) NOT NULL COMMENT '學年', `total_score` INT(4) NOT NULL COMMENT '總分', `avg_score` DECIMAL(4,2) NOT NULL COMMENT '平均分', PRIMARY KEY (`id`) ) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
初始化資料:
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);
儲存過程:
在這裡主要以上面的場景為例,使用儲存過程迴圈去處理資料。寫一個儲存過程,將以上資料每個學生的成績進行彙總。
-- 如果儲存過程存在,先刪除儲存過程 DROP PROCEDURE IF EXISTS statistics_achievement; DELIMITER $$ -- 定義儲存過程 CREATE PROCEDURE statistics_achievement() BEGIN -- 定義變數記錄迴圈處理是否完成 DECLARE done BOOLEAN DEFAULT FALSE; -- 定義變數傳遞學生id DECLARE studentid BIGINT(12); -- 定義遊標 DECLARE cursor_student CURSOR FOR SELECT id FROM t_student; -- 定義CONTINUE HANDLER,當迴圈結束時 done=true DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=TRUE; -- 開啟遊標 OPEN cursor_student; -- 重複遍歷 REPEAT -- 每次讀取一次遊標 FETCH cursor_student INTO studentid; -- 計算總分、平均分插入彙總表 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`; -- 結束迴圈,意思是等到done=true時,結束迴圈REPEAT UNTIL done END REPEAT; -- 查詢結果,僅會展示查出的最後一條 SELECT studentid; -- 關閉遊標 CLOSE cursor_student; END$$ DELIMITER ;
-- 執行儲存過程 CALL statistics_achievement();
儲存過程也有很強大的功能,如果是一名DBA那麼寫儲存過程是分分鐘的事,但是作為一名專做業務的碼農還是不建議去使用儲存過程寫業務程式碼。前公司同事適應了寫儲存過程,有業務改動時不時的直接用儲存過程搞定了,到最後直接就是一大堆堆儲存過程程式碼,一個儲存過程下來幾百上千行sql程式碼頭都看暈掉,出問題巨難維護,稍有不熟的人員都不敢輕舉妄動,今天在這裡也只是為了講解儲存過程中的迴圈而舉了個栗子請別介意。
總之我認為儲存過程主要還是用來臨時處理一些資料方便而用一下,特別有些業務改造大,需要做資料割接總不能挨個去寫一個業務程式碼吧。
到此這篇關於MySql儲存過程迴圈的使用分析詳解的文章就介紹到這了,更多相關MySql儲存過程迴圈內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45