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