Atitit mysql 存儲過程捕獲所有異常,以及日志記錄異常信息


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模式最簡單,whilerepeat都麻煩店。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模式最簡單,whilerepeat都麻煩店。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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM