掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流

創(chuàng)新互聯(lián)專注于甘泉網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供甘泉營銷型網(wǎng)站建設,甘泉網(wǎng)站制作、甘泉網(wǎng)頁設計、甘泉網(wǎng)站官網(wǎng)定制、成都微信小程序服務,打造甘泉網(wǎng)絡公司原創(chuàng)品牌,更為您提供甘泉網(wǎng)站排名全網(wǎng)營銷落地服務。
定義條件是指事先定義程序執(zhí)行過程中遇到的問題,處理程序定義了在遇到這些問題時應當采取的處理方式和解決辦法,保證存儲過程和函數(shù)在遇到警告或錯誤時能繼續(xù)執(zhí)行,從而增強程序處理問題的能力,避免程序出現(xiàn)異常被停止執(zhí)行。
下面將詳細講解如何定義條件和處理程序。
mysql 中可以使用
DECLARE 關鍵字來定義條件。其基本語法如下:
DECLARE condition_name CONDITION FOR condition_value condition value: SQLSTATE [VALUE] sqlstate_value | mysql_error_code
其中:
下面定義“ERROR 1146 (42S02)”這個錯誤,名稱為 can_not_find。 可以用兩種不同的方法來定義,代碼如下:
//方法一:使用sqlstate_value DECLARE can_not_find CONDITION FOR SQLSTATE '42S02'; //方法二:使用 mysql_error_code DECLARE can_not_find CONDITION FOR 1146;
MySQL 中可以使用
DECLARE 關鍵字來定義處理程序。其基本語法如下:
DECLARE handler_type HANDLER FOR condition_value[...] sp_statement handler_type: CONTINUE | EXIT | UNDO condition_value: SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code
其中,handler_type 參數(shù)指明錯誤的處理方式,該參數(shù)有 3 個取值。這 3 個取值分別是 CONTINUE、EXIT 和 UNDO。
注意:通常情況下,執(zhí)行過程中遇到錯誤應該立刻停止執(zhí)行下面的語句,并且撤回前面的操作。但是,MySQL 中現(xiàn)在還不能支持 UNDO 操作。因此,遇到錯誤時最好執(zhí)行 EXIT 操作。如果事先能夠預測錯誤類型,并且進行相應的處理,那么可以執(zhí)行 CONTINUE 操作。
參數(shù)指明錯誤類型,該參數(shù)有 6 個取值:
sp_statement 參數(shù)為程序語句段,表示在遇到定義的錯誤時,需要執(zhí)行的一些存儲過程或函數(shù)。
下面是定義處理程序的幾種方式,代碼如下:
//方法一:捕獲 sqlstate_value DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info='CAN NOT FIND'; //方法二:捕獲 mysql_error_code DECLARE CONTINUE HANDLER FOR 1146 SET @info='CAN NOT FIND'; //方法三:先定義條件,然后調(diào)用 DECLARE can_not_find CONDITION FOR 1146; DECLARE CONTINUE HANDLER FOR can_not_find SET @info='CAN NOT FIND'; //方法四:使用 SQLWARNING DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR'; //方法五:使用 NOT FOUND DECLARE EXIT HANDLER FOR NOT FOUND SET @info='CAN NOT FIND'; //方法六:使用 SQLEXCEPTION DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';
上述代碼是 6 種定義處理程序的方法。
定義條件和處理順序,具體的執(zhí)行過程如下:
mysql> CREATE TABLE t8(s1 INT,PRIMARY KEY(s1));
Query OK, 0 rows affected (0.07 sec)
mysql> DELIMITER //
mysql> CREATE PROCEDURE handlerdemo()
-> BEGIN
-> DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @X2=1;
-> SET @X=1;
-> INSERT INTO t8 VALUES(1);
-> SET @X=2;
-> INSERT INTO t8 VALUES(1);
-> SET @X=3;
-> END //
Query OK, 0 rows affected (0.02 sec)
mysql> DELIMITER ;
mysql> CALL handlerdemo();
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT @X;
+------+
| @X |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
上述代碼中,@X 是一個用戶變量,執(zhí)行結果 @X 等于 3,這表明 MySQL 執(zhí)行到程序的末尾。
如果
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @X2=1;這一行不存在,第二個 INSERT 因 PRIMARY KEY 約束而失敗之后,MySQL 可能已經(jīng)采取 EXIT 策略,且 SELECT @X 可能已經(jīng)返回 2。
注意:@X 表示用戶變量,使用 SET 語句為其賦值,用戶變量與連接有關,一個客戶端定義的變量不能被其他客戶端所使用,當客戶端退出時,該客戶端連接的所有變量將自動釋放。

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流