MySQL雙層游標(biāo)嵌套循環(huán)實(shí)現(xiàn)方法
1、需求描述
1、在項(xiàng)目中,需要將A表中主鍵id,逐個(gè)取出,作為條件,在B表中去逐一查詢(xún),將B表查詢(xún)到的結(jié)果集(A表B表關(guān)系:一對(duì)多),逐一遍歷,連同A表的id拼接運(yùn)算,逐個(gè)插入到C表中。
2、 在Java中很容易實(shí)現(xiàn),A表獲取到的結(jié)果集,循環(huán)遍歷取出id,去B表查詢(xún);遍歷B表結(jié)果集,插入到C表中。 相當(dāng)于2個(gè)循環(huán),即可實(shí)現(xiàn)需求。 這樣會(huì)有一個(gè)問(wèn)題,頻繁連接數(shù)據(jù)庫(kù),造成大量資源開(kāi)銷(xiāo)。 那么在存儲(chǔ)過(guò)程中,該怎么實(shí)現(xiàn)呢?
2、思路
要實(shí)現(xiàn)逐行獲取數(shù)據(jù),需要用到MySQL中的游標(biāo),一個(gè)游標(biāo)相當(dāng)于一個(gè)for循環(huán),這里需要用到2個(gè)游標(biāo)。如何在MySQL中實(shí)現(xiàn)游標(biāo)雙層循環(huán)呢?
3、創(chuàng)建存儲(chǔ)過(guò)程
CREATE DEFINER=`root`@`%` PROCEDURE `student`() BEGIN -- 定義變量 -- 假設(shè)有一張學(xué)生表,有id,student_name字段 DECLARE outer_done INT DEFAULT FALSE; -- 外層游標(biāo)控制變量 DECLARE studentTableId int; -- 學(xué)生表ID declare studentTableName VARCHAR(100); -- 學(xué)生姓名 declare outer_cursor cursor for select id,student_name from student_table where `disable` = '0'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET outer_done = TRUE; open outer_cursor; while not outer_done do fetch outer_cursor into studentTableId,studentTableName; -- 這里循環(huán)取值,賦值到上面定義的變量中 -- 開(kāi)始定義內(nèi)層游標(biāo) BEGIN -- inner BEGIN -- 假設(shè)有一張成績(jī)表,包含字段id,student_name,score字段 DECLARE scoreTableId int; -- 成績(jī)Id declare scoreTableName VARCHAR(100); -- 學(xué)生名字 declare scoreTableScore float; -- 學(xué)生分?jǐn)?shù) DECLARE inner_done int DEFAULT FALSE ; DECLARE my_value VARCHAR(255); declare inner_cursor cursor for select id,student_name,score from score_table where `disable` = '0'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET inner_done = TRUE ; OPEN inner_cursor; -- 打開(kāi)內(nèi)層游標(biāo) WHILE not inner_done DO -- inner WHILE FETCH inner_cursor INTO scoreTableId,scoreTableName,scoreTableScore ; -- 從【內(nèi)層游標(biāo)】中獲取數(shù)據(jù),賦值到定義變量中 IF studentTableName = scoreTableName THEN -- 判斷名字一樣(測(cè)試,生產(chǎn)不要用名稱(chēng)進(jìn)行判斷) set my_value = CONCAT_WS('-',studentTableName,scoreTableScore); -- 給變量賦值 CONCAT_WS函數(shù)可以按照固定的連接符,將數(shù)據(jù)進(jìn)行連接,例如 張三-95 select my_value; -- 打印變量值 END IF; -- 假設(shè)有一張匯總表(summary_table),將處理的數(shù)據(jù)進(jìn)行更新 update summary_table set summary_column=my_value where summary_table_student_id=studentTableId; END WHILE ; -- END inner WHILE CLOSE inner_cursor; -- 循環(huán)結(jié)束后,關(guān)閉內(nèi)層游標(biāo) END; -- END inner BEGIN end while; close outer_cursor; END
看圖清晰一點(diǎn)。
到這里就完成了,存儲(chǔ)過(guò)程里面的注釋很詳細(xì),就不多贅述了,我在寫(xiě)存儲(chǔ)過(guò)程中也是踩了不少坑,記錄下來(lái),希望能幫到各位coder。
到此這篇關(guān)于MySQL雙層游標(biāo)嵌套循環(huán)方法的文章就介紹到這了,更多相關(guān)mysql游標(biāo)嵌套循環(huán)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux下將數(shù)據(jù)庫(kù)從MySQL遷移到MariaDB的基礎(chǔ)操作教程
這篇文章主要介紹了將數(shù)據(jù)庫(kù)從MySQL遷移到MariaDB的基礎(chǔ)操作教程,當(dāng)然遷移之前不要忘記數(shù)據(jù)庫(kù)的備份!需要的朋友可以參考下2015-11-11MySQL之七種SQL JOINS實(shí)現(xiàn)的圖文詳解
這篇文章主要介紹了MySQL中七種SQL JOINS的實(shí)現(xiàn)方法及圖文詳解,文中也有相關(guān)的代碼示例供大家參考,感興趣的同學(xué)可以參考閱讀下2023-06-06mysql觸發(fā)器一個(gè)表改變另一個(gè)表也改變問(wèn)題
這篇文章主要介紹了mysql觸發(fā)器一個(gè)表改變另一個(gè)表也改變問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08MySQL中substr函數(shù)使用方法實(shí)例詳解
MySQL的SUBSTR()函數(shù)可以用于從指定字符串的指定位置開(kāi)始提取指定長(zhǎng)度的字符,下面這篇文章主要給大家介紹了關(guān)于MySQL中substr函數(shù)使用方法的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08深入解析MySQL的事務(wù)隔離及其對(duì)性能產(chǎn)生的影響
這篇文章主要介紹了MySQL的事務(wù)隔離及其對(duì)性能產(chǎn)生的影響,在MySQL的優(yōu)化方面具有一定的借鑒意義,需要的朋友可以參考下2015-12-12mysql 8.0.15 安裝配置方法圖文教程(Windows10 X64)
這篇文章主要為大家詳細(xì)介紹了Windows10 X64 mysql 8.0.15 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03mysql alter table命令修改表結(jié)構(gòu)實(shí)例
這篇文章主要介紹了mysql alter table命令修改表結(jié)構(gòu)實(shí)例的相關(guān)資料,需要的朋友可以參考下2016-10-10mybatis分頁(yè)插件pageHelper詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了mybatis分頁(yè)插件pageHelper詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05