对于一般的程序员,使用的存储过程并不多,要快速入手,有一个模板是非常重要的。
要点:
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');