轉載自https://blog.csdn.net/starinbrook/article/details/77078126
轉載自https://blog.csdn.net/makang456/article/details/53896346/
【簡介】
游標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。
游標充當指針的作用。
盡管游標能遍歷結果中的所有行,但他一次只指向一行。
游標的作用就是用于對查詢數據庫所返回的記錄進行遍歷,以便進行相應的操作。
【用法】
一、聲明一個游標: declare 游標名稱 CURSOR for table;(這里的table可以是你查詢出來的任意集合)
二、打開定義的游標:open 游標名稱;
三、獲得下一行數據:FETCH ?游標名稱 into testrangeid,versionid;
四、需要執行的語句(增刪改查):這里視具體情況而定
五、釋放游標:CLOSE 游標名稱;
注:mysql存儲過程每一句后面必須用;結尾,使用的臨時字段需要在定義游標之前進行聲明。
【實例說明】
有兩個表stu_info、stu_info_bak,表結構完全一致,建表腳本如下:
CREATE TABLE `stu_info` (
`stuId` varchar(20) NOT NULL COMMENT '學號',
`stuName` varchar(20) NOT NULL COMMENT '姓名',
`phone` varchar(11) DEFAULT NULL COMMENT '手機號碼',
`idNumber` varchar(20) DEFAULT NULL COMMENT '身份證號碼',
PRIMARY KEY (`stuId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='學生信息';
CREATE TABLE `stu_info_bak` (
`stuId` varchar(20) NOT NULL COMMENT '學號',
`stuName` varchar(20) NOT NULL COMMENT '姓名',
`phone` varchar(11) DEFAULT NULL COMMENT '手機號碼',
`idNumber` varchar(20) DEFAULT NULL COMMENT '身份證號碼',
PRIMARY KEY (`stuId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='學生信息備份';
stu_info表中有幾條數據,stu_info_bak中沒有數據,現在想要把stu_info中的數據全部備份到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);
##創建游標,并存儲數據
DECLARE cur CURSOR FOR SELECT stuId,stuName,phone,idNumber FROM stu_info;
##游標中的內容執行完后將done設置為true
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
##打開游標
OPEN cur;
##執行循環
read_loop : LOOP
##取游標中的值
FETCH cur INTO v_stuId,v_stuName,v_phone,v_idNumber;
##判斷是否結束循環,一定要放到FETCH之后,因為在fetch不到的時候才會設置done為true
##如果放到fetch之前,先判斷done,這個時候done的值還是之前的循環的值,因此就會導致循環一次
IF done THEN
LEAVE read_loop;
END IF;
## 執行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;
##釋放游標
CLOSE cur;
END
$$
delimiter;
call `proc_copy_stu_info`();
commit;