Java教程

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

本文主要是介绍储存过程中的游标使用-游标sql如何使用传入变量,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

 

这篇关于储存过程中的游标使用-游标sql如何使用传入变量的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!