mysql loop循环实例_MySql CURSOR+LOOP循环-使用小实例
轉(zhuǎn)載自https://blog.csdn.net/starinbrook/article/details/77078126
轉(zhuǎn)載自https://blog.csdn.net/makang456/article/details/53896346/
【簡(jiǎn)介】
游標(biāo)實(shí)際上是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機(jī)制。
游標(biāo)充當(dāng)指針的作用。
盡管游標(biāo)能遍歷結(jié)果中的所有行,但他一次只指向一行。
游標(biāo)的作用就是用于對(duì)查詢(xún)數(shù)據(jù)庫(kù)所返回的記錄進(jìn)行遍歷,以便進(jìn)行相應(yīng)的操作。
【用法】
一、聲明一個(gè)游標(biāo): declare 游標(biāo)名稱(chēng) CURSOR for table;(這里的table可以是你查詢(xún)出來(lái)的任意集合)
二、打開(kāi)定義的游標(biāo):open 游標(biāo)名稱(chēng);
三、獲得下一行數(shù)據(jù):FETCH ?游標(biāo)名稱(chēng) into testrangeid,versionid;
四、需要執(zhí)行的語(yǔ)句(增刪改查):這里視具體情況而定
五、釋放游標(biāo):CLOSE 游標(biāo)名稱(chēng);
注:mysql存儲(chǔ)過(guò)程每一句后面必須用;結(jié)尾,使用的臨時(shí)字段需要在定義游標(biāo)之前進(jìn)行聲明。
【實(shí)例說(shuō)明】
有兩個(gè)表stu_info、stu_info_bak,表結(jié)構(gòu)完全一致,建表腳本如下:
CREATE TABLE `stu_info` (
`stuId` varchar(20) NOT NULL COMMENT '學(xué)號(hào)',
`stuName` varchar(20) NOT NULL COMMENT '姓名',
`phone` varchar(11) DEFAULT NULL COMMENT '手機(jī)號(hào)碼',
`idNumber` varchar(20) DEFAULT NULL COMMENT '身份證號(hào)碼',
PRIMARY KEY (`stuId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='學(xué)生信息';
CREATE TABLE `stu_info_bak` (
`stuId` varchar(20) NOT NULL COMMENT '學(xué)號(hào)',
`stuName` varchar(20) NOT NULL COMMENT '姓名',
`phone` varchar(11) DEFAULT NULL COMMENT '手機(jī)號(hào)碼',
`idNumber` varchar(20) DEFAULT NULL COMMENT '身份證號(hào)碼',
PRIMARY KEY (`stuId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='學(xué)生信息備份';
stu_info表中有幾條數(shù)據(jù),stu_info_bak中沒(méi)有數(shù)據(jù),現(xiàn)在想要把stu_info中的數(shù)據(jù)全部備份到stu_info_bak表中。
【處理腳本】
delimiter $$
drop procedure if exists `proc_copy_stu_info` $$
CREATE PROCEDURE `proc_copy_stu_info`()
BEGIN
##定義變量
DECLARE done INT DEFAULT FALSE;
DECLARE v_stuId VARCHAR(20);
DECLARE v_stuName VARCHAR(20);
DECLARE v_phone VARCHAR(11);
DECLARE v_idNumber VARCHAR(20);
##創(chuàng)建游標(biāo),并存儲(chǔ)數(shù)據(jù)
DECLARE cur CURSOR FOR SELECT stuId,stuName,phone,idNumber FROM stu_info;
##游標(biāo)中的內(nèi)容執(zhí)行完后將done設(shè)置為true
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
##打開(kāi)游標(biāo)
OPEN cur;
##執(zhí)行循環(huán)
read_loop : LOOP
##取游標(biāo)中的值
FETCH cur INTO v_stuId,v_stuName,v_phone,v_idNumber;
##判斷是否結(jié)束循環(huán),一定要放到FETCH之后,因?yàn)樵趂etch不到的時(shí)候才會(huì)設(shè)置done為true
##如果放到fetch之前,先判斷done,這個(gè)時(shí)候done的值還是之前的循環(huán)的值,因此就會(huì)導(dǎo)致循環(huán)一次
IF done THEN
LEAVE read_loop;
END IF;
## 執(zhí)行SQL操作
SET @sql_insert = CONCAT("insert into stu_info_bak(stuId,stuName,phone,idNumber) VALUES ('",v_stuId,"','",v_stuName,"','",v_phone,"','",v_idNumber,"')");
PREPARE sqlli FROM @sql_insert;
EXECUTE sqlli;
COMMIT;
END LOOP read_loop;
##釋放游標(biāo)
CLOSE cur;
END
$$
delimiter;
call `proc_copy_stu_info`();
commit;
總結(jié)
以上是生活随笔為你收集整理的mysql loop循环实例_MySql CURSOR+LOOP循环-使用小实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何保持进步
- 下一篇: SQL Server之增删改查