mysql 存储过程模板-用游标获取数据并修改

    对于一般的程序员,使用的存储过程并不多,要快速入手,有一个模板是非常重要的。

要点:

   1. 存储过程创建的模板

   2.参数的定义

   3.游标的使用

   4. LOOP循环的使用

   5.表名使用变量的解决方案,借助中间表或者视图

   6.sql语句中包含变量,需要先拼接,后执行器执行

注意:

   1.定义参数代码时不能夹杂赋值代码

   2.游标定义赋值中不能使用变量

   3.sql语句中不能直接使用变量

模板代码:

 1 DELIMITER $$
 2 
 3 USE `dbName`$$
 4 
 5 DROP PROCEDURE IF EXISTS `updateTermNo`$$
 6 
 7 CREATE DEFINER=`root`@`%` PROCEDURE `updateTermNo`(IN table_name VARCHAR(32),IN cloumn_name VARCHAR(32))
 8 BEGIN
 9     DECLARE tid INT;
10     DECLARE termNo VARCHAR(32);
11     DECLARE done INT DEFAULT FALSE;
12     
13     DECLARE termInfo CURSOR FOR ( -- 定义
14         SELECT id FROM table_view
15     );
16     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 监听器
17      
18       DROP VIEW IF EXISTS table_view; -- 判断删除视图
19       
20       -- 创建视图
21       SET @SELECT = CONCAT('CREATE VIEW table_view as SELECT id, ',cloumn_name,' as tnum FROM ', table_name , ';');
22       PREPARE stm FROM @SELECT;
23       EXECUTE stm;
24       DEALLOCATE PREPARE stm;
25         
26     OPEN termInfo; -- 打开游标
27     label:LOOP
28         
29         FETCH termInfo INTO tid;
30         
31         IF done THEN LEAVE label;END IF;
32     
33         SELECT tnum INTO termNo FROM table_view WHERE id  = tid; -- 从视图中获取的终端编号
34         
35            START TRANSACTION; -- 开启事务
36            
37       -- 执行更新
38           SET @UPDATE = CONCAT('UPDATE ',table_name ,' SET ', cloumn_name  , '= LPAD(',termNo,',9,0) WHERE id = ',tid);
39          -- select concat('更新语句:', @UPDATE);
40       PREPARE stm FROM @UPDATE;
41       EXECUTE stm;
42       DEALLOCATE PREPARE stm;
43           
44       COMMIT;-- 提交
45       
46     END LOOP label;
47     CLOSE termInfo; -- 关闭游标
48 END$$
49 
50 DELIMITER ;
51 
52 -- 终端列表
53 CALL updateTermNo('tableName','columnsName');

 

posted @ 2018-09-27 15:17  园中菜鸟  阅读(1916)  评论(0)    收藏  举报