1. 程式人生 > >MySQL定義異常和異常處理方法

MySQL定義異常和異常處理方法

在MySQL中,特定異常需要特定處理。這些異常可以聯絡到錯誤,以及子程式中的一般流程控制。定義異常是事先定義程式執行過程中遇到的問題,異常處理定義了在遇到問題時對應當採取的處理方式,並且保證儲存過程或者函式在遇到錯誤時或者警告時能夠繼續執行。

1 異常定義

1.1 語法

DECLARE condition_name CONDITION FOR [condition_type];

1.2 說明

condition_name引數表示異常的名稱;

condition_type引數表示條件的型別,condition_type由SQLSTATE [VALUE] sqlstate_value|mysql_error_code組成:

  • sqlstate_value和mysql_error_code都可以表示MySQL的錯誤;
  • sqlstate_value為長度為5的字串型別的錯誤程式碼;
  • mysql_error_code為數值型別錯誤程式碼;

1.3 示例

定義“ERROR 1148(42000)”錯誤,名稱為command_not_allowed。可以有以下兩種方法:

//方法一:使用sqlstate_value

DECLARE command_not_allowed CONDITION FOR SQLSTATE '42000';

//方法二:使用mysql_error_code

DECLARE command_not_allowed CONDITION FOR 1148;

2 自定義異常處理

2.1 異常處理語法

DECLARE handler_type HANDLER FOR condition_value [,...] sp_statement

2.2 引數說明

handler_type: CONTINUE|EXIT|UNDO

  • handler_type為錯誤處理方式,引數為3個值之一;
  • CONTINUE表示遇到錯誤不處理,繼續執行;
  • EXIT表示遇到錯誤時馬上退出;
  • UNDO表示遇到錯誤後撤回之前的操作,MySQL暫不支援回滾操作; 

condition_value: SQLSTATE [VALUE] sqlstate_value| condition_name|SQLWARNING|NOT FOUND|SQLEXCEPTION|mysql_error_code

  • condition_value表示錯誤型別;
  • SQLSTATE [VALUE] sqlstate_value為包含5個字元的字串錯誤值;
  • condition_name表示DECLARE CONDITION定義的錯誤條件名稱;
  • SQLWARNING匹配所有以01開頭的SQLSTATE錯誤程式碼;
  • NOT FOUND匹配所有以02開頭的SQLSTATE錯誤程式碼;
  • SQLEXCEPTION匹配所有沒有被SQLWARNING或NOT FOUND捕獲的SQLSTATE錯誤程式碼;
  • mysql_error_code匹配數值型別錯誤程式碼;

2.3 異常捕獲方法

//方法一:捕獲sqlstate_value異常

//這種方法是捕獲sqlstate_value值。如果遇到sqlstate_value值為"42S02",執行CONTINUE操作,並輸出"NO_SUCH_TABLE"資訊

DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info='NO_SUCH_TABLE';

//方法二:捕獲mysql_error_code異常

//這種方法是捕獲mysql_error_code值。如果遇到mysql_error_code值為1146,執行CONTINUE操作,並輸出"NO_SUCH_TABLE"資訊;

DECLARE CONTINUE HANDLER FOR 1146 SET @info='NO_SUCH_TABLE';

//方法三:先定義條件,然後捕獲異常

DECLARE no_such_table CONDITION FOR 1146;

DECLARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info='NO_SUCH_TABLE';

//方法四:使用SQLWARNING捕獲異常

DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR';

//方法五:使用NOT FOUND捕獲異常

DECLARE EXIT HANDLER FOR NOT FOUND SET @info='NO_SUCH_TABLE';

//方法六:使用SQLEXCEPTION捕獲異常

DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';

3 綜合示例

建立一個表,設定該表的主鍵,在不定義異常處理和定義異常處理情況下看執行到哪一步。

show databases;
use wms;
create table location
(
location_id int primary key,
location_name varchar(50)
);

示例1:不定義異常情況下

DELIMITER //
CREATE PROCEDURE handlerInsertNoException()
BEGIN
	/*DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2=1;*/
	SET @x=1;
	INSERT INTO location VALUES (1,'Beijing');
	SET @x=2;
	INSERT INTO location VALUES (1,'Wuxi');
	SET @x=3;
END;
//
DELIMITER ;
呼叫儲存過程與結果:
mysql> call handlerInsertNoException();
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> select @x;
+------+
| @x   |
+------+
|    2 |
+------+
1 row in set (0.00 sec)

mysql> select * from location;
+-------------+---------------+
| location_id | location_name |
+-------------+---------------+
|           1 | Beijing       |
+-------------+---------------+
1 row in set (0.00 sec)


 

注意:操作示例2前要清空表中資料,並退出重新登入,以免客戶端變數@x影響,詳細說明參見結論中的第一點。

mysql> truncate table location;
Query OK, 0 rows affected (0.04 sec)
mysql> select * from location;
Empty set (0.00 sec)
mysql> exit;
Bye

[email protected]:~$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 53
Server version: 5.5.38-0ubuntu0.14.04.1 (Ubuntu)

mysql> use wms;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from location;
Empty set (0.00 sec)

mysql> select @x;
+------+
| @x   |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

示例2:定義異常處理情況下:

DELIMITER //
CREATE PROCEDURE handlerInsertWithException()
BEGIN
	DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2=1;
	SET @x=1;
	INSERT INTO location VALUES (1,'Beijing');
	SET @x=2;
	INSERT INTO location VALUES (1,'Wuxi');
	SET @x=3;
END;
//
DELIMITER ;

呼叫儲存過程與結果:
mysql> CALL handlerInsertWithException();
Query OK, 0 rows affected (0.09 sec)

mysql> select @x;
+------+
| @x   |
+------+
|    3 |
+------+
1 row in set (0.00 sec)

說明與結論:

一、MySQL中,@var_name表示使用者變數,使用SET語句為其賦值,使用者變數與連線有關,一個客戶端定義的變數不能被其他客戶端看到或者使用。當客戶端退出時,該客戶端連線的所有變數將自動釋放。

二、在示例1中,由於註釋了異常的宣告"",此時向表中插入相同主鍵,就會觸發異常,並且採取預設(EXIT)路徑;且檢視此時的@x返回2,表示下面的INSERT語句並沒有執行就退出了.

三、定義了異常處理,此時遇到錯誤也會按照異常定義那樣繼續執行;但只有第一條資料被插入到表中,此時使用者變數@x=3說明已經執行到了結尾;

-----------------------------------------------------------------------------------------------------------------------------

如果您們在嘗試的過程中遇到什麼問題或者我的程式碼有錯誤的地方,請給予指正,非常感謝!

聯絡方式:[email protected]

版權@:轉載請標明出處!

相關推薦

MySQL定義異常異常處理方法

在MySQL中,特定異常需要特定處理。這些異常可以聯絡到錯誤,以及子程式中的一般流程控制。定義異常是事先定義程式執行過程中遇到的問題,異常處理定義了在遇到問題時對應當採取的處理方式,並且保證儲存過程或者函式在遇到錯誤時或者警告時能夠繼續執行。 1 異常定義 1.1 語法

python常見異常分類與處理方法

異常 error python except try Python常見異常類型大概分為以下類: 1.AssertionError:當assert斷言條件為假的時候拋出的異常 2.AttributeError:當訪問的對象屬性不存在的時候拋出的異常 3.IndexError

學習筆記17_網站異常日誌處理

add asa asp 日誌類 cte clob rect string 學習 *在clobal.asax中,寫protected void Application_Error() {   Respone.Redirect("Default.aspx");//發生錯誤能在此

PHP 處理異常 Python 處理異常 的區別

PHP 處理異常 和 Python 處理異常 一、PHP捕獲異常 1.PHP 錯誤型別 2.PHP 例子 二、Python 捕獲異常 1.Python例子 一、PHP捕獲異常 1.PHP 錯誤型別 級別常量 錯誤報告描述

Python異常異常處理

Python異常和異常處理2017年12月20日 22:17:08 Megustas_JJC 閱讀數:114 標籤: python 異常處理 更多 個人分類: Python 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/Megustas_JJC/arti

Cris 的Python筆記(十三):異常檔案處理

文章目錄 1. Python 是如何處理異常的? 2. Python 中常用的檔案處理語法(重點) 3. Python 處理二進位制檔案 4. seek 和 tell 方法 5. 檔案操作之 os 包的常

有關PHP異常錯誤處理機制的思考(二)

通過上篇文章呢,咱們對於PHP異常的定義、捕獲、處理等方面有了簡單的一個概念,這次呢,咱們就來看下關於異常的同胞兄弟,錯誤,以及錯誤的一個處理機制。 我們要知道,PHP中,錯誤處理,比異常處理,更加重要和凸顯價值,咱們之前的文章呢,已經把錯誤的概念介紹過了,現在,咱們就相比較於異常,來給錯誤

有關PHP異常錯誤處理機制的思考(一)

我們從一門語言的層面上來看的話,這個語言通常具有很多的錯誤處理的一個模式,但是這些個錯誤處理模式,往往就是建立在約定俗成的基礎上,也可以說,這些錯誤都是可以預知的。 但是在大型的一個專案或者說系統裡,如果我們每次呼叫一個功能模組的時候,都去逐一檢測我們這個模組中肯能存在的錯誤,很明顯的就會看

Java基礎---異常異常處理

Java異常體系         |——Throwable  (實現類描述java的錯誤和異常--超類)             |——Error (錯誤)一般不通過程式碼去處理。             |——Exceprion (異常)  程式碼處理           

Python的異常異常處理----17

異常 錯誤和異常 錯誤指的是可以人為避免的 異常是指在語法邏輯正確的情況下,出現問題 在Python中,異常是一個類,可以處理和使用 異常的分類 BaseException 所有異常的基類 SystemExit 直

eclipse中常見的一些異常對應的處理方法!

大家在用eclipse編寫JAVA程式的過程中可能經常會遇到一些編譯報異常的情況,如果你細心留意就會發現異常無非就是那幾類而已,今天我總結了一下java中常見的一些異常,希望能幫大家在程式設計的路上提供一些幫助, NO.1 java.lang.NullPoin

建設局專案總結(三)——ASP.NET 實現自動捕獲異常異常處理

               建設局專案幾乎要接近尾聲了,從頭到尾差不多有半個月的時間吧,半個月 不知不覺就這樣過去了,總結這半個月,好像每天都很忙,每天都很忙碌,但是仔細想想好像又沒做出多少正兒八經的工作量,總共做了下面幾個模組: 獎項懲罰列表,編輯等 企業資訊編輯

iOS中json解析出現NSNull的異常閃退處理方法

JSON建構有兩種結構: json簡單說就是JavaScript中的物件和陣列,所以這兩種結構就是物件和陣列2種結構,通過這兩種結構可以表示各種複雜的結構 1、物件:物件在js中表示為“{}”擴起來的內容,資料結構為 {key:value,key:val

關於TCP連線極端異常情況的處理方法的思考

這裡說的極端異常情況,不是對方(伺服器或者客戶端)一般的異常情況,即引用該TCP連線的程序異常退出而由OS直接發出FIN或者RST包,從而關閉這個連線。這樣本方會受到SOCKET_ERR返回,或者len=0的資料。 這裡說的極端情況是對方主機或者網路裝置突然斷電造成的連線

java異常異常體系

urn 執行過程 必須 sys ... 值類型 存在 6.2 結果 16.異常 16.1程序執行過程中出現的影響程序正常運行的現象。 16.2異常語法 try{ //代碼塊 }catch(異常類型 e){ }catch(異常類型2 e2){

CentOS7下mysql忘記root密碼的處理方法

uri mys ati pac span ble spa AS gin 1. vi /etc/my.cnf,在[mysqld]中添加 skip-grant-tables 例如: [mysqld] skip-grant-tables datadir=/var/lib/

線上MYSQL同步報錯故障處理方法總結

table 存在 index 刪除 查找 skip number hat rec 前言 在發生故障切換後,經常遇到的問題就是同步報錯,下面是最近收集的報錯信息。 記錄刪除失敗 在master上刪除一條記錄,而slave上找不到 Last_SQL_Error:

java中的時間計算格式處理方法

//一天秒數 public final static long MILLISECONDS_OF_DAY = 1000 * 60 * 60 * 24; public final static long MINUTES_OF_DAY = 1000 * 60 * 60 * 24; p

當linux系統中mysql 隨機密碼錯誤的處理方法

本人親測~~ 首先是要滿足我們產生的隨機密碼和我們實際輸入的隨機密碼是一致然後系統顯示密碼錯誤 因為我第一次修改所以沒有截圖  教程還是有的 異常,密碼錯誤,無法登陸!!! 重置root密碼 1、首先停止mysql服務程序: service mysqld stop

MATLAB-VISSIM模擬過程的呼叫事件處理方法

%%建立VISSIM的COM介面 vissim =actxserver('VISSIM.vissim.430'); %% 載入交通網路 current_path = pwd; vissim.LoadNe