mysql创建存储过程,使用游标循环结果集

mysql创建存储过程(不使用工具创建)

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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值