《MYSQL數(shù)據(jù)庫(kù)mysql存儲(chǔ)過(guò)程中的異常處理解析》要點(diǎn):
本文介紹了MYSQL數(shù)據(jù)庫(kù)mysql存儲(chǔ)過(guò)程中的異常處理解析,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
MYSQL必讀定義異常捕獲類(lèi)型及處理辦法:?
MYSQL必讀
DECLARE handler_action HANDLER
FOR condition_value [, condition_value] ...
statement
handler_action:
CONTINUE
| EXIT
| UNDO
condition_value:
mysql_error_code
| SQLSTATE [VALUE] sqlstate_value
| condition_name
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION
MYSQL必讀這里面需要注意幾點(diǎn):?
MYSQL必讀a、condition_value [,condition_value],這個(gè)的話說(shuō)明可以包括多種情況(方括弧表示可選的),也就是一個(gè)handler可以定義成針對(duì)多種情況進(jìn)行相應(yīng)的 操作;另外condition_value可以包括的值有上面列出來(lái)的6種:
MYSQL必讀1、mysql_error_code,這個(gè)表示mysql的錯(cuò)誤代碼,錯(cuò)誤代碼是一個(gè)數(shù)字,完成是由mysql自己定義的,這個(gè)值可以參考mysql數(shù)據(jù)庫(kù)錯(cuò)誤代碼及信息.
MYSQL必讀2、SQLSTATE [VALUE] sqlstate_value,這個(gè)同錯(cuò)誤代碼類(lèi)似形成一一對(duì)應(yīng)的關(guān)系,它是一個(gè)5個(gè)字符組成的字符串,關(guān)鍵的地方是它從ANSI SQL和ODBC這些標(biāo)準(zhǔn)中引用過(guò)來(lái)的,因此更加標(biāo)準(zhǔn)化,而不像上面的error_code完全是mysql自己定義給自己用的,這個(gè)和第一個(gè)類(lèi)似也可以 參考mysql數(shù)據(jù)庫(kù)錯(cuò)誤代碼及信息.
MYSQL必讀3、condtion_name,這個(gè)是條件名稱,它使用DECLARE...CONDITION語(yǔ)句來(lái)定義,這個(gè)后面我們會(huì)介紹如何定義自己的condition_name.
MYSQL必讀4、SQLWARNING,表示SQLTATE中的字符串以‘01'起始的那些錯(cuò)誤,比如Error: 1311 SQLSTATE: 01000 (ER_SP_UNINIT_VAR)
MYSQL必讀5、NOT FOUND,表示SQLTATE中的字符串以‘02'起始的那些錯(cuò)誤,比如Error: 1329 SQLSTATE: 02000 (ER_SP_FETCH_NO_DATA)
MYSQL必讀6、SQLEXCEPTION,表示SQLSTATE中的字符串不是以'00'、'01'、'02' 起始的那些錯(cuò)誤,這里'00'起始的SQLSTATE其實(shí)表示的是成功執(zhí)行而不是錯(cuò)誤,另外兩個(gè)就是上面的4和5的兩種情況.?
MYSQL必讀上面的6種情況其實(shí)可以分為兩類(lèi):
MYSQL必讀一類(lèi)就是比較明確的處理,就是對(duì)指定的錯(cuò)誤情況進(jìn)行處理,包括1、2、3這三種方式;
MYSQL必讀另一類(lèi)是對(duì)對(duì)應(yīng)類(lèi)型的錯(cuò)誤的 處理,就是對(duì)某一群錯(cuò)誤的處理,包括4、5、6這三種方式.這個(gè)是介紹了condition_value.另外還要注意的一個(gè)內(nèi)容是MySQL在默認(rèn)情況 下(也就是我們沒(méi)有定義處理錯(cuò)誤的辦法-handler)自己的錯(cuò)誤處理機(jī)制:
MYSQL必讀1、對(duì)于SQLWARNING和NOT FOUND的處理辦法就是無(wú)視錯(cuò)誤繼續(xù)執(zhí)行,所以在游標(biāo)的例子里面如果我們沒(méi)有對(duì)repeat的條件判斷的那個(gè)值做個(gè)no_more_products=1的handler來(lái)處理,那么循環(huán)就會(huì)一直下去.
MYSQL必讀2、對(duì)于SQLEXCEPTION的話,其默認(rèn)的處理辦法是在出現(xiàn)錯(cuò)誤的地方就終止掉了.?
MYSQL必讀b、statement,這個(gè)比較簡(jiǎn)單就是當(dāng)出現(xiàn)某種條件/錯(cuò)誤時(shí),我們要執(zhí)行的語(yǔ)句,可以是簡(jiǎn)單的如 SET? var = value這樣的簡(jiǎn)單的語(yǔ)句,也可以是復(fù)雜的多行的語(yǔ)句,多行的話可以使用BEGIN? .....? END這里把語(yǔ)句包括在里面(這個(gè)好比delphi里面的情況,注意到我們的存儲(chǔ)過(guò)程也是多行的,所以也要BEGIN .... END).
MYSQL必讀c、handler_action,這個(gè)表示當(dāng)執(zhí)行完上面的statement后,希望執(zhí)行怎樣的動(dòng)作,這里包括CONTINUE、EXIT、UNDO, 表示繼續(xù)、退出、撤銷(xiāo)(暫時(shí)不支持).這邊就是兩種動(dòng)作,其實(shí)這兩種動(dòng)作在上面也說(shuō)過(guò)了,CONTINUE就是一個(gè)是SQLWARNING和NOT FOUND的默認(rèn)處理辦法,而EXIT就是SQLEXCEPTION的默認(rèn)處理辦法.?
MYSQL必讀另:?
MYSQL必讀condition_name:命名條件?
MySQL error code或者SQLSTATE code的可讀性太差,所以引入了命名條件:?
MYSQL必讀語(yǔ)法:?
MYSQL必讀
DECLARE condition_name CONDITION FOR condition_value
condition_value:
SQLSTATE [VALUE] sqlstate_value
| mysql_error_code
MYSQL必讀使用:?
MYSQL必讀
# original
DECLARE CONTINUE HANDLER FOR 1216 MySQL_statements;
# changed
DECLARE foreign_key_error CONDITION FOR 1216;
DECLARE CONTINUE HANDLER FOR foreign_key_error MySQL_statements;
??MYSQL必讀示例:?
MYSQL必讀
CREATE PROCEDURE sp_add_location
(in_location VARCHAR(30),
in_address1 VARCHAR(30),
in_address2 VARCHAR(30),
zipcode VARCHAR(10),
OUT out_status VARCHAR(30))
BEGIN
DECLARE CONTINUE HANDLER
FOR 1062
SET out_status='Duplicate Entry';
SET out_status='OK';
INSERT INTO locations
(location,address1,address2,zipcode)
VALUES
(in_location,in_address1,in_address2,zipcode);
END;
MYSQL必讀以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所贊助,也希望大家多多支持維易PHP.
維易PHP培訓(xùn)學(xué)院每天發(fā)布《MYSQL數(shù)據(jù)庫(kù)mysql存儲(chǔ)過(guò)程中的異常處理解析》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/11510.html