mysql存储过程调试记实
在试运行项目中,因某种原因需要增加一个自增长的字段以适应客户方新需求,由于正式环境运维部门不让开发人员直接连数据库进行操作,所有过程均需通过脚本执行。为了完成该字段的新增,徐要首要对新增的自增字段历史记录填充值,故采用存储过程实现。
调试好的存储过程:
DELIMITER $$
DROP PROCEDURE IF EXISTS `T_FILE_AUTO_INCREMENT_ORDER_NO` $$
CREATE PROCEDURE T_FILE_AUTO_INCREMENT_ORDER_NO()
BEGIN
DECLARE count_row int DEFAULT 1;
DECLARE pid_tmp VARCHAR(50);
DECLARE done INT DEFAULT FALSE;
DECLARE cur_record CURSOR FOR
select `pid` from `t_file`;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur_record;
read_loop: LOOP
FETCH cur_record INTO pid_tmp;
IF done THEN
LEAVE read_loop;
END IF;
update `t_file` set `t_file`.`order_no` = count_row where `t_file`.`pid` = pid_tmp;
set count_row = count_row + 1;
END LOOP;
CLOSE cur_record;
END $$
DELIMITER ;
调整过程中碰到的问题:
1、1054错误:
原代码片段:
DECLARE count_row int DEFAULT ‘1’;
修改后代码:
DECLARE count_row int DEFAULT 1;
错误原因:缺省值类型和变量类型不一致导致;
2、1338错误:
原代码片段:
BEGIN
DECLARE count_row int DEFAULT 1;
DECLARE pid_tmp VARCHAR(50);
DECLARE done INT DEFAULT FALSE;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
DECLARE cur_record CURSOR FOR
select `pid` from `t_file`;
修改后代码:
BEGIN
DECLARE count_row int DEFAULT 1;
DECLARE pid_tmp VARCHAR(50);
DECLARE done INT DEFAULT FALSE;
DECLARE cur_record CURSOR FOR
select `pid` from `t_file`;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 错误原因:游标的error handler定义在游标的定义语句之前导致;
3、变量的改值:
mysql和oracle的改值不同,在MySQL中变量的修改需要添加关键字set,如下:
set count_row = count_row + 1;
想了解更多?现在就开始免费体验