2020年3月25日11:16:15
注意每個版本的mysq的存儲過程,觸發器寫法都會有些許區別,注意查看官方版本,不然你網上copy的語句可能執行無效,或者不成功
官方英文說明文檔
https://dev.mysql.com/doc/refman/5.7/en/cursors.html
demo 數據版本mysql 5.7.22-log
如果需要debug你寫的存儲過程推薦:
dbForge Studio for MySQL 這個工具挺好使的,下載地址,注意你需要調試存儲過程必用這個,不然容易搞瘋人
https://pan.baidu.com/s/1zCE9YGGu6QqkU1UtZk5cDw
提取碼:gb5b
使用請參考
https://blog.csdn.net/weixin_42740530/article/details/94553996
CREATE DEFINER = 'zx'@'%' PROCEDURE `v2-20200212`.zx11 () BEGIN -- 聲明一些需要用到的變量 DECLARE done int DEFAULT FALSE; DECLARE z_id int DEFAULT 0; DECLARE z_admin_login_name varchar(255); DECLARE z_remark varchar(255); -- 聲明游標 DECLARE admin_list CURSOR FOR SELECT `id`, `admin_login_name`, `remark` FROM admin; -- 聲明 是否沒有記錄 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 打開游標 OPEN admin_list; -- 開始循環 read_loop: LOOP -- 注意聲明變量類型和接受數據的順序一致 FETCH admin_list INTO z_id, z_admin_login_name, z_remark; -- 如果沒有結果集就退出循環 IF done THEN LEAVE read_loop; END IF; -- 具體執行的sql語句 UPDATE admin SET remark = z_id WHERE id = z_id; -- 結束循環 END LOOP; -- 關閉游標 CLOSE admin_list; END
官方demo
CREATE PROCEDURE curdemo() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE a CHAR(16); DECLARE b, c INT; DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1; DECLARE cur2 CURSOR FOR SELECT i FROM test.t2; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur1; OPEN cur2; read_loop: LOOP FETCH cur1 INTO a, b; FETCH cur2 INTO c; IF done THEN LEAVE read_loop; END IF; IF b < c THEN INSERT INTO test.t3 VALUES (a,b); ELSE INSERT INTO test.t3 VALUES (a,c); END IF; END LOOP; CLOSE cur1; CLOSE cur2; END;
CREATE DEFINER = 'root'@'localhost'
PROCEDURE `dlc-bed-mc`.zx11()
BEGIN
-- 聲明一些需要用到的變量
DECLARE done int DEFAULT FALSE;
DECLARE dd int DEFAULT 0;
-- 聲明游標
DECLARE order_list CURSOR FOR SELECT DISTINCT(`user_id`) AS user_id FROM phc_order;
-- 聲明 是否沒有記錄
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 打開游標
OPEN order_list;
-- 開始循環
read_loop:LOOP
-- 注意聲明變量類型和接受數據的順序一致
FETCH order_list INTO dd;
-- 如果沒有結果集就退出循環
IF done THEN
LEAVE read_loop;
END IF;
-- 具體執行的sql語句
INSERT INTO `phc_user_deposit` (`user_deposit_id`, `user_id`, `hospital_id`, `price`, `create_time`, `update_time`, `status`, `is_del`) VALUES
(NULL, dd , NULL, '100.00', '2020-03-12 21:07:58', '2020-03-12 21:07:58', 1, 1);
-- 結束循環
END LOOP;
-- 關閉游標
CLOSE order_list;
END