游標
游標(Cursor)是處理數據的一種方法,為了查看或者處理結果集中的數據,游標提供了在結果集中一次一行或者多行前進或向后瀏覽數據的能力。
使用步驟
- 聲明一個游標: declare 游標名稱 CURSOR for table;(這里的table可以是你查詢出來的任意集合)
- 打開定義的游標:open 游標名稱;
- 獲得下一行數據:FETCH 游標名稱 into field_1, field_2;
- 需要執行的語句(增刪改查):這里視具體情況而定
- 釋放游標:CLOSE 游標名稱;
注:存儲過程臨時字段定義需要在游標定義之前。
示例:
delimiter ;; drop procedure if exists `proc_test` ;; CREATE PROCEDURE `proc_test`() BEGIN -- 定義變量 DECLARE done INT DEFAULT FALSE;
DECLARE field_1 VARCHAR(20); DECLARE field_2 VARCHAR(20);-- 創建游標,並存儲數據 DECLARE cur_list CURSOR FOR SELECT id, name FROM user; -- 游標中的內容執行完后將done設置為true DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true; -- 打開游標 OPEN cur_list; -- 執行循環 read_loop : LOOP -- 取游標中的值 FETCH cur_list INTO field_1, field_2; -- 判斷是否結束循環,一定要放到FETCH之后,因為在fetch不到的時候才會設置done為true -- 如果放到fetch之前,先判斷done,這個時候done的值還是之前的循環的值,因此就會導致循環一次 IF done THEN LEAVE read_loop; END IF;
-- 執行SQL操作 SET @sql_insert = CONCAT("insert into user_bak(id, name) VALUES ('", field_1, "','", field_2 ,"')"); PREPARE sqlli FROM @sql_insert; EXECUTE sqlli; COMMIT; END LOOP read_loop; -- 釋放游標 CLOSE cur_list; END ;; delimiter;