MySQL中的異常處理


1,定義

  與java中的異常一樣,都是用來定義在處理過程中遇到的問題以及相應的處理方式。

2,自定義異常及處理方式

  1,自定義異常語句

    DECLARE condition_name CONDITION FOR condition_value;

    condition_name:是自己起的名字,最好見名知意。

    condition_value:可以是SQLSTATE[VALUE] sqlstate_value也可以是mysql_error_value。

      sqlstate_value是長度為5的字符串錯誤代碼。

      mysql_error_value是數值類型的錯誤代碼。

  2,自定義異常處理

    DECLARE handler_type HANDLER FOR condition_value sp_statement;

    handler_type:有三個取值

      CONTINUE:遇到錯誤不進行處理,跳過錯誤繼續執行之后的代碼。

      EXIT:遇到錯誤時馬上退出,不再執行之后的操作。

      UNDO:遇到錯誤后撤回之前已經執行的操作,MySQL暫不支持該操作。

    condition_value:錯誤名稱:有以下取值

      condition_name:定義異常時取的名字

      mysql_error_value:數值類型的錯誤代碼

      SQLWARNING:對所有01開頭的SQLSTATE代碼的速記    

      NOT FOUND:對所有01開頭的SQLSTATE代碼的速記

      SQLEXCEPTION:除SQLWARNING和NOT FOUND之外的SQLSTATE代碼的速記。

    sp_statement:異常之后的處理。

  3,實例展示

    創建以下表格,將u_id設置為主鍵,並插入以下數據:

    創建一個名為insert_user的存儲過程:

BEGIN
    set @x = 1;
    insert into users values(3,'zhaoliu',26);
    set @x = 2;
    insert into users values(4,'zhouqi',27);
    set @x = 3;
END

 

    通過使用用戶變量@x來查看代碼是否運行,調用存儲過程

call insert_user();

 

    出現以下錯誤

其中數字1062就是mysql_error_code。對應的sqlstate_value是‘23000’,具體的對應方式可以看對應表。

查看@x的值

select @x;

 

可以看到u_id = 3的這條語句出現了異常。

接下來我們加入異常處理:

BEGIN
    #Routine body goes here...
    #方式一:直接異常處理
    #declare exit HANDLER FOR 1062 set @x1 = 4;
    #方式二:先自定義異常,再使用異常處理
    DECLARE error1 CONDITION for 1062;
    declare exit HANDLER FOR 1062 set @x1 = 4; -- 在這里handler_type先使用exit
    set @x = 1;
    insert into users values(3,'zhaoliu',26);
    set @x = 2;
    insert into users values(4,'zhouqi',27);
    set @x = 3;
END

 

 

在這里為了檢驗效果,我們設置的對異常的處理是將@x1設置為4。

再次調用該存儲過程就不會報錯了

select @x,@x1;

 

查詢用戶變量

發現當出現異常時,程序會執行異常的處理並且退出該過程。

將過程中的handler_type改成continue,再次執行該過程,也不會出錯。

查詢用戶變量

發現對於異常處理之后,會繼續運行之后的代碼

查詢users表

異常的插入語句沒有執行,但是后面的沒有發生異常的語句執行了。

 


免責聲明!

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



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