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

百度了一下都是在说,要先声明变量,再开始游标。
游标(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();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜七天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值