MYSQL 存储过程异常处理 报错 错误代码: 1337

来源:互联网 发布:国外网络安全设备品牌 编辑:程序博客网 时间:2024/06/05 16:47
百度了一下都是在说,要先声明变量,再开始游标。
游标(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();