1.游标直接使用入参变量不生效的情况
1.1 作为表名和变量名不生效,不支持拼接
1.2 作为条件的值可以使用
2。解决游标动态获取入参- 通过创建视图view间接实现动态读取入参
实现思路:将变量转变了固定的;
a. 将动态传入的表名,转化为固定的视图里面
b. 通过统一视图*(v_customer_region_view),接收不同表明需要查询的结果字段
1 CREATE PROCEDURE do_modify_reion_data( 2 TableName VARCHAR(68)-- 表名 3 ) 4 BEGIN 5 DECLARE vStr VARCHAR(8000); 6 DECLARE vId int(10); 7 DECLARE done INT; 8 DECLARE indexPage INT; 9 10 -- 定义游标 11 DECLARE custCursor CURSOR 12 FOR 13 SELECT id FROM v_customer_region_view; 14 -- 定义结束标记 15 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 16 -- 游标查询sql,不支持入参变量直接拼接; 17 -- 通过拼接sql,创建视图,将入参传入的表名,间接固定; 18 -- 并且将sql执行,这个用到了创建视图 v_customer_region_view ,然后将视图作为游标查询的表 19 set @sql =concat("create view v_customer_region_view as select id from ", TableName," where id > 1"); 20 21 -- 这个地方就是将拼接sql执行 22 DROP VIEW IF EXISTS v_customer_region_view; 23 PREPARE stmt1 FROM @sql; 24 EXECUTE stmt1 ; 25 DEALLOCATE PREPARE stmt1; 26 27 SET vStr = ''; 28 SET indexPage = 0; 29 30 -- 打开custCursor游标 31 OPEN custCursor; 32 33 -- 循环vSerialNo 34 custLoop:LOOP 35 36 -- 取游标中的数据 37 FETCH custCursor INTO vId; 38 IF done = 1 THEN 39 LEAVE custLoop; 40 END IF; 41 -- 批量处理100条 42 IF indexPage = 0 THEN 43 SET vStr = CONCAT('(',vStr, vId ); 44 SET indexPage = indexPage +1; 45 ELSE 46 SET vStr = CONCAT(vStr,", ", vId ); 47 SET indexPage = indexPage +1; 48 END IF; 49 50 -- 100条更新一次 51 IF indexPage = 100 THEN 52 SET vStr = CONCAT(vStr,')'); 53 SET @sqlstr = CONCAT( 54 -- sql语句 55 "UPDATE ", TableName, " SET name = 'admin' WHERE id in ",vStr 56 ); 57 -- 日志打印 58 insert into temp_log select concat(' ',@sqlstr); 59 PREPARE stmt FROM @sqlstr; 60 EXECUTE stmt; 61 DEALLOCATE PREPARE stmt; 62 SET indexPage = 0; 63 END IF; 64 65 -- 关闭游标custCursor 66 END LOOP; 67 CLOSE custCursor; 68 IF indexPage >= 1 THEN 69 SET vStr = CONCAT(vStr,')'); 70 71 SET @sqlstr = CONCAT( 72 -- sql语句 73 "UPDATE ", TableName, " SET name = 'admin' WHERE id in ",vStr 74 ); 75 -- 日志打印 76 insert into temp_log select concat('myvar is ',@sqlstr); 77 78 PREPARE stmt FROM @sqlstr; 79 EXECUTE stmt; 80 -- 释放数据资源 81 DEALLOCATE PREPARE stmt; 82 END IF; 83 -- 执行完删除视图 84 DROP VIEW IF EXISTS v_customer_region_view; 85 END; 86 87 -- 日志表 88 89 DROP TABLE IF EXISTS `temp_log`; 90 CREATE TABLE `temp_log` ( 91 `desc` varchar(400) NOT NULL DEFAULT '' COMMENT '存储过程日志' 92 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存储过程日志';游标使用入参表名