use test; -- test:数据库名。 进入test数据库
DROP PROCEDURE IF EXISTS user; -- synchron_user:存储过程名。 存在synchron_user存储过程,则删除
delimiter // -- mysql语句结束符号从分号 ; 临时改为 //
CREATE PROCEDURE synchron_user(IN source_table VERCHAR(200)) -- source_table:传入参数变量名
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
END; -- sql异常报错,则回滚
DECLARE EXIT HANDLER FOR SQLWARNING
BEGIN
ROLLBACK;
END; -- sql警告,则回滚
START TRANSACTION; -- 开启事务
update @source_table set username='张三'; -- 具体的sql语句,注意:存储过程不能使用LOAD DATA 同步数据
COMMIT; -- 提交
END // -- 结束
delimiter;
mysql存储过程,循环结果集,使用游标(使用工具创建存储过程,直接BEGIN开始)
BEGIN
DECLARE s int DEFAULT 0; -- 定义变量s
DECLARE tmp_id BIGINT(20); -- 定义变量tmp_id
-- DECLARE tmp_name VERCHAR(255); -- 定义变量tmp_name
DECLARE report CURSOR FOR SELECT id FROM department; -- 定义游标,并将查询到的结果集赋值到游标中
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1; -- 游标遍历完后,将变量s的值设为1,表示循环结束
OPEN report; -- 开启游标
FETCH report INTO tmp_id; -- 将游标中的值赋值给变量。注意:变量名不能与返回的列名相同,变量顺序与sql结果列的顺序一致
-- 当s不等于1时,未遍历完
WHILE s <> 1 DO
-- 需要执行的sql
UPDATE department SET parent_ids =(SELECT SUBSTRING( SELECT GROUP_CONCAT(d.id SEPARATOR ':') tmp_ids FROM (
SELECT t2.id, t2.parent_id
FROM(
SELECT @r AS _id,
(SELECT @r := parent_id FROM department WHERE id = _id) AS parent_id,
@a := @a + 1 AS tmp
FROM
(SELECT @r := tmp_id, @a := 0) vars,
department h -- 不可少
WHERE @r <> 0) t1
JOIN department t2
ON t1._id = t2.id
ORDER BY id ASC
) d, 2) AS ids) -- 2:'截取的下标'
WHERE id = tmp_id;
FRTCH report INTO tmp_id; -- 将游标中的值再赋值给变量,供下次循环使用
-- 当s=1时,循环结束,退出循环
END WHILE;
-- 关闭游标
CLOSE report;
-- 返回值0, 默认
RETURN 0;
END