百度了一下都是在说,要先声明变量,再开始游标。
游标(cursor)必须在声明处理程序之前被声明,并且变量和条件必须在声明游标或处理程序之前被声明。
错误代码: 1337
Variable or condition declaration after cursor or handler declaration
错误的写法:
DROP PROCEDURE IF EXISTS `proc_statistical` ;
DELIMITER ;;
CREATE DEFINER = `root` @`localhost` PROCEDURE `proc_statistical` ()
BEGIN
#Routine body goes here...
-- 遍历数据结束标志
DECLARE t_error INTEGER DEFAULT 0;
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND SET @t_error = 1;
DECLARE cnt INT ;
START TRANSACTION ;
内容
IF @t_error = 1 THEN
ROLLBACK;
// 纪录失败日志
ELSE
// 记录成功日志
COMMIT;
END IF;
END ;;
DELIMITER ;
CALL proc_statistical();
报错的错误信息:
会提示在 DECLARE t_error INTEGER DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND S右边出错。
错误代码: 1337
Variable or condition declaration after cursor or handler declaration
仔细查询了资料之后发现:如果你把游标定义在其他变量之前,会出现错误1337。
正确的写法:
DROP PROCEDURE IF EXISTS `proc_statistical` ;
DELIMITER ;;
CREATE DEFINER = `root` @`localhost` PROCEDURE `proc_statistical` ()
BEGIN
#Routine body goes here...
DECLARE cnt INT ;
-- 遍历数据结束标志
DECLARE t_error INTEGER DEFAULT 0;
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND SET @t_error = 1;
START TRANSACTION ;
内容
IF @t_error = 1 THEN
ROLLBACK;
// 纪录失败日志
ELSE
// 记录成功日志
COMMIT;
END IF;
END ;;
DELIMITER ;
CALL proc_statistical();