mysql储存过程获取系统异常

第一次写储存过程,在这个异常处理上面爬了好多坑,记录一下获取系统异常的写法, 要特别注意begin end的位置,位置不一样,结果也不一样,还有就是自定义异常与全局异常结合使用,需要申明全局异常,然后在全局异常下,自定义异常需要用begin end包含起来,自定义异常会自己处理begin end之间的异常

创建储存过程

DROP PROCEDURE IF EXISTS test;

CREATE PROCEDURE test ()

BEGIN
	-- 异常状态
DECLARE EXP_NO INT DEFAULT 0;

-- 异常信息结果
DECLARE EXP_RESULT VARCHAR (4000) ;

DECLARE CODE1 VARCHAR (4000);

DECLARE msg1 VARCHAR (4000);


	-- 如果出现异常就将exp_no设置为1
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND 

BEGIN
GET DIAGNOSTICS CONDITION 1 
CODE1 = RETURNED_SQLSTATE,
 msg1 = MESSAGE_TEXT;
SET EXP_NO = 1;
END;
-- 执行sql语句
 DROP TABLE test2;


BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND set EXP_NO =1;
 DROP TABLE peple;


 IF EXP_NO = 1 THEN
	 SET EXP_RESULT = '改表不存在';
SELECT V_EXCEP;
END IF;
END;
-- 这里必须要写点东西,不然编译不通过,我也不知道怎么回事,可能是连着两个if吧
select EXP_RESULT;

IF EXP_NO = 1 THEN 
SELECT code1 ,msg1;
SET EXP_RESULT = CONCAT(code1, '-----', msg1);
select EXP_RESULT;
END IF;


END;

测试 call test();

返回结果
mysql储存过程获取系统异常_第1张图片
在这里插入图片描述
在这里插入图片描述

注释掉 DROP TABLE test2; 再call

 -- DROP TABLE test2;

mysql储存过程获取系统异常_第2张图片
结果,因为注释掉有错的sql,所以全局异常为空

mysql储存过程获取系统异常_第3张图片
mysql储存过程获取系统异常_第4张图片
在这里插入图片描述

你可能感兴趣的:(数据库,mysql,数据库,sql)