储存过程中的游标使用-游标SQL如何使用传入变量

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='存储过程日志';
游标使用入参表名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值