日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
MySQL定義條件和處理程序
在程序的運(yùn)行過(guò)程中可能會(huì)遇到問(wèn)題,此時(shí)我們可以通過(guò)定義條件和處理程序來(lái)事先定義這些問(wèn)題。

創(chuàng)新互聯(lián)專注于甘泉網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供甘泉營(yíng)銷型網(wǎng)站建設(shè),甘泉網(wǎng)站制作、甘泉網(wǎng)頁(yè)設(shè)計(jì)、甘泉網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造甘泉網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供甘泉網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

定義條件是指事先定義程序執(zhí)行過(guò)程中遇到的問(wèn)題,處理程序定義了在遇到這些問(wèn)題時(shí)應(yīng)當(dāng)采取的處理方式和解決辦法,保證存儲(chǔ)過(guò)程和函數(shù)在遇到警告或錯(cuò)誤時(shí)能繼續(xù)執(zhí)行,從而增強(qiáng)程序處理問(wèn)題的能力,避免程序出現(xiàn)異常被停止執(zhí)行。

下面將詳細(xì)講解如何定義條件和處理程序。

1. 定義條件

mysql 中可以使用
DECLARE 關(guān)鍵字來(lái)定義條件。其基本語(yǔ)法如下:

DECLARE condition_name CONDITION FOR condition_value
condition value:
SQLSTATE [VALUE] sqlstate_value | mysql_error_code

其中:

  • condition_name 參數(shù)表示條件的名稱;
  • condition_value 參數(shù)表示條件的類型;
  • sqlstate_value 參數(shù)和 mysql_error_code 參數(shù)都可以表示 MySQL 的錯(cuò)誤。sqlstate_value 表示長(zhǎng)度為 5 的字符串類型錯(cuò)誤代碼,mysql_error_code 表示數(shù)值類型錯(cuò)誤代碼。例如 ERROR 1146(42S02) 中,sqlstate_value 值是 42S02,mysql_error_code 值是 1146。

例 1

下面定義“ERROR 1146 (42S02)”這個(gè)錯(cuò)誤,名稱為 can_not_find。 可以用兩種不同的方法來(lái)定義,代碼如下:

//方法一:使用sqlstate_value
DECLARE can_not_find CONDITION FOR SQLSTATE '42S02';

//方法二:使用 mysql_error_code
DECLARE can_not_find CONDITION FOR 1146;

2. 定義處理程序

MySQL 中可以使用
DECLARE 關(guān)鍵字來(lái)定義處理程序。其基本語(yǔ)法如下:

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ù)指明錯(cuò)誤的處理方式,該參數(shù)有 3 個(gè)取值。這 3 個(gè)取值分別是 CONTINUE、EXIT 和 UNDO。

  • CONTINUE 表示遇到錯(cuò)誤不進(jìn)行處理,繼續(xù)向下執(zhí)行;
  • EXIT 表示遇到錯(cuò)誤后馬上退出;
  • UNDO 表示遇到錯(cuò)誤后撤回之前的操作,MySQL 中暫時(shí)還不支持這種處理方式。

注意:通常情況下,執(zhí)行過(guò)程中遇到錯(cuò)誤應(yīng)該立刻停止執(zhí)行下面的語(yǔ)句,并且撤回前面的操作。但是,MySQL 中現(xiàn)在還不能支持 UNDO 操作。因此,遇到錯(cuò)誤時(shí)最好執(zhí)行 EXIT 操作。如果事先能夠預(yù)測(cè)錯(cuò)誤類型,并且進(jìn)行相應(yīng)的處理,那么可以執(zhí)行 CONTINUE 操作。

參數(shù)指明錯(cuò)誤類型,該參數(shù)有 6 個(gè)取值:

  • sqlstate_value:包含 5 個(gè)字符的字符串錯(cuò)誤值;
  • condition_name:表示 DECLARE 定義的錯(cuò)誤條件名稱;
  • SQLWARNING:匹配所有以 01 開(kāi)頭的 sqlstate_value 值;
  • NOT FOUND:匹配所有以 02 開(kāi)頭的 sqlstate_value 值;
  • SQLEXCEPTION:匹配所有沒(méi)有被 SQLWARNING 或 NOT FOUND 捕獲的 sqlstate_value 值;
  • mysql_error_code:匹配數(shù)值類型錯(cuò)誤代碼。

sp_statement 參數(shù)為程序語(yǔ)句段,表示在遇到定義的錯(cuò)誤時(shí),需要執(zhí)行的一些存儲(chǔ)過(guò)程或函數(shù)。

例 2

下面是定義處理程序的幾種方式,代碼如下:

//方法一:捕獲 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 種定義處理程序的方法。

  1. 捕獲 sqlstate_value 值。如果遇到 sqlstate_value 值為 42S02,執(zhí)行 CONTINUE 操作,并且輸出“CAN NOT FIND”信息。
  2. 捕獲 mysql_error_code 值。如果遇到 mysql_error_code 值為 1146, 執(zhí)行 CONTINUE 操作,并且輸出“CAN NOT FIND”信息。
  3. 先定義條件,然后再調(diào)用條件。這里先定義 can_not_find 條件,遇到 1146 錯(cuò)誤就執(zhí)行 CONTINUE 操作。
  4. 使用 SQLWARNING。SQLWARNING 捕獲所有以 01 開(kāi)頭的 sqlstate_value 值,然后執(zhí)行 EXIT 操作,并且輸出“ERROR"信息。
  5. 使用 NOT FOUND。NOT FOUND 捕獲所有以 02 開(kāi)頭的 sqlstate_value 值,然后執(zhí)行 EXIT 操作,并且輸出“CAN NOT FIND”信息。
  6. 使用 SQLEXCEPTION。 SQLEXCEPTION 捕獲所有沒(méi)有被 SQLWARNING 或 NOT FOUND 捕獲的 sqlstate_value 值,然后執(zhí)行 EXIT 操作,并且輸出“ERROR”信息。

例 3

定義條件和處理順序,具體的執(zhí)行過(guò)程如下:

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 是一個(gè)用戶變量,執(zhí)行結(jié)果 @X 等于 3,這表明 MySQL 執(zhí)行到程序的末尾。

如果
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @X2=1;這一行不存在,第二個(gè) INSERT 因 PRIMARY KEY 約束而失敗之后,MySQL 可能已經(jīng)采取 EXIT 策略,且 SELECT @X 可能已經(jīng)返回 2。

注意:@X 表示用戶變量,使用 SET 語(yǔ)句為其賦值,用戶變量與連接有關(guān),一個(gè)客戶端定義的變量不能被其他客戶端所使用,當(dāng)客戶端退出時(shí),該客戶端連接的所有變量將自動(dòng)釋放。


當(dāng)前標(biāo)題:MySQL定義條件和處理程序
轉(zhuǎn)載源于:http://m.5511xx.com/article/dpdsgeo.html