1.游标直接使用入参变量不生效的情况
1.1 作为表名和变量名不生效,不支持拼接
1.2 作为条件的值可以使用
2、解决游标动态获取入参
通过创建视图view间接实现动态读取入参:
实现思路:将变量转变了固定的;
a. 将动态传入的表名,转化为固定的视图里面
b. 通过统一视图*(v_customer_region_view),接收不同表明需要查询的结果字段
CREATE PROCEDURE do_modify_reion_data(
TableName VARCHAR(68)-- 表名
)
BEGIN
DECLARE vStr VARCHAR(8000);
DECLARE vId int(10);
DECLARE done INT;
DECLARE indexPage INT;
-- 定义游标
DECLARE custCursor CURSOR
FOR
SELECT id FROM v_customer_region_view;
-- 定义结束标记
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 游标查询sql,不支持入参变量直接拼接;
-- 通过拼接sql,创建视图,将入参传入的表名,间接固定;
-- 并且将sql执行,这个用到了创建视图 v_customer_region_view ,然后将视图作为游标查询的表
set @sql =concat("create view v_customer_region_view as select id from ", TableName," where id > 1");
-- 这个地方就是将拼接sql执行
DROP VIEW IF EXISTS v_customer_region_view;
PREPARE stmt1 FROM @sql;
EXECUTE stmt1 ;
DEALLOCATE PREPARE stmt1;
SET vStr = '';
SET indexPage = 0;
-- 打开custCursor游标
OPEN custCursor;
-- 循环vSerialNo
custLoop:LOOP
-- 取游标中的数据
FETCH custCursor INTO vId;
IF done = 1 THEN
LEAVE custLoop;
END IF;
-- 批量处理100条
IF indexPage = 0 THEN
SET vStr = CONCAT('(',vStr, vId );
SET indexPage = indexPage +1;
ELSE
SET vStr = CONCAT(vStr,", ", vId );
SET indexPage = indexPage +1;
END IF;
-- 100条更新一次
IF indexPage = 100 THEN
SET vStr = CONCAT(vStr,')');
SET @sqlstr = CONCAT(
-- sql语句
"UPDATE ", TableName, " SET name = 'admin' WHERE id in ",vStr
);
-- 日志打印
insert into temp_log select concat(' ',@sqlstr);
PREPARE stmt FROM @sqlstr;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET indexPage = 0;
END IF;
-- 关闭游标custCursor
END LOOP;
CLOSE custCursor;
IF indexPage >= 1 THEN
SET vStr = CONCAT(vStr,')');
SET @sqlstr = CONCAT(
-- sql语句
"UPDATE ", TableName, " SET name = 'admin' WHERE id in ",vStr
);
-- 日志打印
insert into temp_log select concat('myvar is ',@sqlstr);
PREPARE stmt FROM @sqlstr;
EXECUTE stmt;
-- 释放数据资源
DEALLOCATE PREPARE stmt;
END IF;
-- 执行完删除视图
DROP VIEW IF EXISTS v_customer_region_view;
END;
-- 日志表
DROP TABLE IF EXISTS `temp_log`;
CREATE TABLE `temp_log` (
`desc` varchar(400) NOT NULL DEFAULT '' COMMENT '存储过程日志'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存储过程日志';
游标使用入参表名