mysql 存儲過程 獲取錯誤信息 繼續執行

MySQL存儲過程當中的錯誤處理

做者:UncleToo  來源:翻譯  日期:2014-05-20 7:53:13 
收藏  評論:( 2 )  閱讀:1985sql

MySQL存儲過程當中的錯誤處理

       當MySQL執行存儲過程遇到錯誤時,適當處理它,如繼續執行或退出當前代碼段,並返回有意義的錯誤提示是很重要的。一方面提升程序的容錯能力,另外一方便當程序出錯時,開發人員也能準肯定位錯誤的地方。學習

在本章MySQL教程中,咱們將學習如何在存儲過程當中處理程序錯誤測試

 

聲明處理程序spa

MySQL爲咱們提供了一種簡單的方法定義處理程序,咱們能夠使用DECLARE HANDLER語句,以下所示:翻譯

1code

DECLARE action HANDLER FOR condition_value statement;教程

若是其值與condition_value匹配,MySQL將執行statement,而且根據action值選擇繼續或退出當前代碼塊。ci

action 能夠是如下兩種:開發

  • CONTINUE:繼續執行當前代碼塊get

  • EXIT:退出當前代碼塊

condition_value 是一類特定的條件,能夠使一下幾種:

  • 一個MYSQL錯誤代碼

  • 一個標準的SQLSTATE值,如SQLWARNING,NOTFOUND ,SQLEXCEPTION等

statement 是一個語句塊,從BEGIN開始,到END結束。它能夠是一個簡單的sql語句,也能夠是很複雜的邏輯語句。

 

MySQL錯誤處理的例子

例1:當程序發生錯誤,將has_error值置爲1。如:

1

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET has_error = 1;

 

例2:當遇到錯誤時,程序將回滾以前的操做,同時給出錯誤提示,而後退出當前程序塊。如:

1

2

3

4

5

DECLARE EXIT HANDLER FOR SQLEXCEPTION

BEGIN

ROLLBACK;

Select '發生錯誤,執行將被回滾,程序將終止執行';

END;


例3:對於遊標或select into操做,若是出現找不到記錄的狀況,將no_row_found賦值爲1。如:

1

DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_row_found = 1;

 

例4:若是出現重複鍵值,MySQL會給出1062的錯誤,將給出錯誤提示,程序繼續運行。如:

1

2

DECLARE CONTINUE HANDLER FOR 1062

Select '錯誤:重複鍵值';

 

在存儲過程當中MySQL的處理程序的例子

首先咱們建立一張數據表,爲測試所用。

1

2

3

4

5

Create TABLE article_tags(

    article_id INT,

    tag_id     INT,

    PRIMARY KEY(article_id,tag_id)

);

article_tags表用來存儲文章及標籤之間的關係(多對多)。article_id存儲文章ID,tag_id存儲標籤ID

 

其次,咱們建立一個存儲過程,實現插入文章ID和標籤ID。

1

2

3

4

5

6

7

8

9

10

11

DELIMITER $$

Create PROCEDURE insert_article_tags(IN article_id INTIN tag_id INT)

BEGIN

    DECLARE CONTINUE HANDLER FOR 1062

    Select CONCAT('錯誤:重複鍵值 (',article_id,',',tag_id,')'AS msg;

    -- 插入新的記錄

    Insert INTO article_tags(article_id,tag_id)

    VALUES(article_id,tag_id);

    -- 返回標籤數量

    Select COUNT(*) FROM article_tags;

END

相關文章
相關標籤/搜索