DELIMITER $$USE `vgos0120`$$DROP PROCEDURE IF EXISTS `AddOuterNetUsers2`$$CREATE DEFINER=`root`@`%` PROCEDURE `AddOuterNetUsers2`(IN p_ecname VARCHAR(100),IN p_outerUserName VARCHAR(100), IN p_outerUserCode VARCHAR(50))
LABEL_PROC:
BEGIN
  DECLARE v_eccode    VARCHAR(50) DEFAULT '';
  DECLARE v_grpid  INT DEFAULT -100;
  DECLARE v_cnt    INT;
  DECLARE v_errorinfo    VARCHAR(500) DEFAULT '';
  DECLARE EXIT HANDLER FOR SQLEXCEPTION LABEL_test;
  SET v_errorinfo = CONCAT(p_ecname,';',p_outerUserName,';',p_outerUserCode,';');
  SELECT COUNT(*) INTO v_cnt FROM  qw_ecinfo a,grp_info b WHERE a.ecname=p_ecname AND a.eccode=b.grp_code;
  CASE  
  WHEN v_cnt>1 THEN
     INSERT INTO AddOuterNetUsers_log(tim,opi) VALUES (NOW(), CONCAT(v_errorinfo,':The EC name not only!Error'));
  WHEN v_cnt=0 THEN  
     INSERT INTO AddOuterNetUsers_log(tim,opi) VALUES (NOW(), CONCAT(v_errorinfo,':EC unregistered!Error'));
  ELSE
        START TRANSACTION;-- 事务开始
        INSERT INTO AddOuterNetUsers_log(tim,opi) VALUES (NOW(), CONCAT(v_errorinfo,':The user_code not only!Error'));
        INSERT INTO user_info(media_mes,user_name) VALUES (1111,p_outerUserName);
        INSERT INTO AddOuterNetUsers_log(tim,opi) VALUES (NOW(), v_errorinfo);
  END CASE;
END LABEL_PROC$$;LABEL_test:
BEGIN
    INSERT INTO t1(id,dt) VALUES (1,NOW());
END LABEL_test$$;DELIMITER ;这个存储过程编译报错。
在存储过程中能否实现 如果存储执行异常,然后跳转到LABEL_test标签,
就像 DECLARE EXIT HANDLER FOR SQLEXCEPTION LABEL_test;这样。

解决方案 »

  1.   

    不能,SQL语句的异常可以被捕捉处理,但如果是存储过程自身则没有办法。
      

  2.   

    我想实现的功能其实是
    存储过程中如果执行异常,那么执行rollback,然后在错误日志表中记录一下,然后对输出参数赋值。
    相当于存储过程中如果执行异常,可以执行一系列的操作。
    我目前只能完成如果执行异常,那么就执行一步操作,要么rollback,要么错误日志表中记录一下,要么对输出参数赋值。反正只能做一步操作。
    请帮忙。
      

  3.   


    我想实现的功能其实是
    存储过程中如果执行异常,那么执行rollback,然后在错误日志表中记录一下,然后对输出参数赋值。
    相当于存储过程中如果执行异常,可以执行一系列的操作。
    我目前只能完成如果执行异常,那么就执行一步操作,要么rollback,要么错误日志表中记录一下,要么对输出参数赋值。反正只能做一步操作。
    请帮忙。
      

  4.   

    已经解决,可以新建一个专门处理错误的存储过程,在这个存储过程中执行rollback,并执行相应的操作。