您的位置:首页 > 数据库 > MySQL

Atitit mysql 存储过程捕获所有异常,以及日志记录异常信息

2017-05-26 23:26 645 查看
Atitit mysql 存储过程捕获所有异常,以及日志记录异常信息

1.1. 异常的处理模式exit continue undo模式 1

1.2. 捕获所有异常使用 DECLARE continue HANDLER FOR sqlexception 1

1.3. 捕获特定异常使用HANDLER FOR errorcode 2

1.4. 记录异常到日志表,获取异常代码和异常信息 2

1.5. 抛出自定义异常 3

2. 程序语言中捕获sql自定义抛出的异常 3

2.1. 代码 3

3. 集合的循环loop while repeat模式 4

3.1. 对集合的循环 使用loop模式最简单,while和repeat都麻烦店。loop模式会自动处理集合结束。 4

3.2. While模式循环集合 。。需要定义一个 CONTINUE HANDLER FOR NOT FOUND 4

3.3. 参考资料 5

1.1. 异常的处理模式exit continue undo模式

默认情况下,mysql异常机制是exit模式,出错直接退出。。

当当我们对一个集合循环做处理的时候,需要捕获异常,记录日志,继续执行。

1.2. 捕获所有异常使用 DECLARE continue HANDLER FOR sqlexception

相比js这一类语言的异常捕获,sql的异常捕获比较粗糙,只能捕获一个sp内的异常,不能精确到某几个代码行。。。

BEGIN

#Routine body goes here...

DECLARE a varchar(102) ; DECLARE code varchar(102) ; DECLARE msg varchar(102) ;

DECLARE b varchar(100) ; DECLARE n int ;

##catch

DECLARE continue HANDLER FOR sqlexception

cat1:BEGIN

GET DIAGNOSTICS CONDITION 1

code = RETURNED_SQLSTATE, msg = MESSAGE_TEXT;

SELECT code,msg;

#exit ALL

#leave cat1;

END;

set n=1;

# while n<5 do

lable:LOOP

call exThrow();

set n=n+1;

select 'in loop';

if n>3 THEN

select ' n>3 ';

leave lable;

end if;

#end while;

end loop;

END

1.3. 捕获特定异常使用HANDLER FOR errorcode

1.4. 记录异常到日志表,获取异常代码和异常信息

GET DIAGNOSTICS CONDITION 1

code = RETURNED_SQLSTATE, msg = MESSAGE_TEXT;

SELECT code,msg;

1.5. 抛出自定义异常

#Routine body goes here...

SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = "extag_1";

2. 程序语言中捕获sql自定义抛出的异常

2.1. 代码

BEGIN

#Routine body goes here...

SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = "extag_1";

END

{

"@type":"java.lang.RuntimeException",

"cause":{

"@type":"java.sql.SQLException",

"errorCode":1644,

"localizedMessage":"extag_1 Query: call exThrow Parameters: []",

"message":"extag_1 Query: call exThrow Parameters: []",

"nextException":{

"errorCode":1644,

"localizedMessage":"extag_1",

"message":"extag_1",

"sQLState":"HY000",

"sQLState":"HY000",

"stackTrace":[{

"localizedMessage":"java.sql.SQLException: extag_1 Query: call exThrow Parameters: []",

"message":"java.sql.SQLException: extag_1 Query: call exThrow Parameters: []",

"stackTrace":[{

3. 集合的循环loop while repeat模式

3.1. 对集合的循环 使用loop模式最简单,while和repeat都麻烦店。loop模式会自动处理集合结束。

BEGIN

#Routine body goes here...

DECLARE a varchar(102) ;

DECLARE b varchar(100) ; DECLARE n int ; DECLARE rs_finished int ;

DECLARE cursor_name CURSOR FOR select id,identity from system_passport order by id desc limit 3;

OPEN cursor_name;

lable:LOOP

fetch cursor_name into a,b;

select a,b;

end LOOP;

END

3.2. While模式循环集合 。。需要定义一个 CONTINUE HANDLER FOR NOT FOUND

BEGIN

#Routine body goes here...

DECLARE a varchar(102) ;

DECLARE b varchar(100) ; DECLARE n int ; DECLARE rs_finished int ;

DECLARE cursor_name CURSOR FOR select id,identity from system_passport order by id desc limit 5;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET rs_finished=1;

#set rs_finished=0;

set n=1;select 'open cursor bef';

OPEN cursor_name;

select 'open cursor after';

fetch cursor_name into a,b;

select a,b;

select rs_finished; # is null

while rs_finished is null do

select a,b;

fetch cursor_name into a,b;

end while;

END

3.3. 参考资料

GET DIAGNOSTIC 语句 - 千里之行始于足下 - 博客频道 - CSDN.NET.html

Atitit mysql数据库自定义异常在java里面的捕获与处理推荐标准与规范

作者:: 绰号:老哇的爪子claw of Eagle 偶像破坏者Iconoclast image-smasher

捕鸟王"Bird Catcher kok 虔诚者Pious 宗教信仰捍卫者 Defender Of the Faith. 卡拉卡拉红斗篷 Caracalla red cloak 万兽之王

简称:: Emir Attilax Akbar 埃米尔 阿提拉克斯 阿克巴

全名::Emir Attilax Akbar bin Mahmud bin attila bin Solomon bin adam Al Rapanui 埃米尔 阿提拉克斯 阿克巴 本 马哈茂德 本 阿提拉 本 所罗门 本亚当 阿尔 拉帕努伊

常用名:艾提拉(艾龙), EMAIL:1466519819@qq.com

头衔:uke总部o2o负责人,全球网格化项目创始人,

uke交友协会会长 uke捕猎协会会长 Emir Uke部落首席大酋长,

uke宗教与文化融合事务部部长, uke宗教改革委员会副主席

uke制度与重大会议委员会委员长,uke保安部首席大队长,uke制度检查委员会副会长,

uke 首席cto 软件部门总监 技术部副总监 研发部门总监主管 产品部副经理 项目部副经理 uke科技研究院院长 uke软件培训大师

uke波利尼西亚区大区连锁负责人 汤加王国区域负责人 uke克尔格伦群岛区连锁负责人,莱恩群岛区连锁负责人,uke布维岛和南乔治亚和南桑威奇群岛大区连锁负责人

Uke软件标准化协会理事长理事长 Uke 数据库与存储标准化协会副会长

uke终身教育学校副校长 Uke医院 与医学院方面的创始人

uec学院校长, uecip图像处理机器视觉专业系主任 uke文档检索专业系主任

Uke图像处理与机器视觉学院首席院长

Uke 户外运动协会理事长 度假村首席大村长 uke出版社编辑总编

转载请注明来源:attilax的专栏 http://blog.csdn.net/attilax
http://www.cnblogs.com/attilax/
--Atiend v9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: