• 关于MySQL存储过程异常处理的一点心得


    DROP PROCEDURE IF EXISTS `SP_MODEL`;

    DELIMITER ;;
    CREATE PROCEDURE `SP_MODEL`(IN V_TYPE INT)
    BEGIN
    /**********存储过程模版,结合了·返回自定义错误信息·错误退出··事物回滚·的功能***********/
    DECLARE V_TEST INT DEFAULT 0;

    DECLARE V_ERR_NO INT DEFAULT 0;
    DECLARE V_ERR_MSG VARCHAR(100) DEFAULT '执行成功';
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND SET V_ERR_NO=1;

    -- CREATE TABLE `test_error` (
    -- `a` int(11) NOT NULL,
    -- `b` int(11) DEFAULT NULL,
    -- PRIMARY KEY (`a`)
    -- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    -- TRUNCATE TABLE TEST_ERROR;
    -- CALL SP_MODEL(1);
    -- SELECT * FROM TEST_ERROR;

    START TRANSACTION;

    Label:-- 执行过程中出现错误则跳出此Label
    BEGIN

    IF V_TYPE=1 THEN
    INSERT INTO TEST_ERROR(a,b) VALUES(1,1);
    INSERT INTO TEST_ERROR(a,b) VALUES(1,1);

    IF V_ERR_NO=1 THEN
    SET V_ERR_MSG='您已经插过啦,别再重复插~';
    -- LEAVE Label;
    END IF;

    SET V_TEST=1;

    INSERT INTO TEST_ERROR(a,b) VALUES(3,'a');
    IF V_ERR_NO=1 THEN
    SET V_ERR_MSG='尺寸不对,插不进来~';
    LEAVE Label;
    END IF;

    INSERT INTO TEST_ERROR(a,b) VALUES(4,1);

    SET V_TEST=2;

    ELSE
    SET V_ERR_MSG='传入参数V_TYPE不正确';
    SET V_ERR_NO=1; -- 直接设置此变量值为1,主动抛出异常
    LEAVE Label;
    END IF;

    END Label;

    IF V_ERR_NO=1 THEN
    ROLLBACK;
    ELSE
    COMMIT;
    END IF;

    SELECT V_ERR_NO AS ERR_NO,V_ERR_MSG AS ERR_MSG, V_TEST AS TEST; -- 返回执行结果
    END

    ;;

    DELIMITER ;

  • 相关阅读:
    NOI2005瑰丽华尔兹
    BZOJ4919[Lydsy1706月赛]大根堆
    BZOJ1097[POI2007]ATR-Tourist Attractions
    Luogu2973 [USACO10HOL]Driving Out the Piggies G
    Luogu5505 JSOI2011分特产
    Luogu1450 HAOI2008硬币购物
    NOI2001 炮兵阵地
    汕头市队赛 SRM 09 A 撕书
    洛谷P1196 银河英雄传说
    洛谷P3144 [USACO16OPEN]关闭农场Closing the Farm
  • 原文地址:https://www.cnblogs.com/lrl45/p/6037513.html
Copyright © 2020-2023  润新知