mysql存儲進程中的異常處置解析。本站提示廣大學習愛好者:(mysql存儲進程中的異常處置解析)文章只能為提供參考,不一定能成為您想要的結果。以下是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
這外面須要留意幾點:
a、condition_value [,condition_value],這個的話解釋可以包含多種情形(方括弧表現可選的),也就是一個handler可以界說成針對多種情形停止響應的 操作;別的condition_value可以包含的值有下面列出來的6種:
1、mysql_error_code,這個表現mysql的毛病代碼,毛病代碼是一個數字,完成是由mysql本身界說的,這個值可以參考mysql數據庫毛病代碼及信息。
2、SQLSTATE [VALUE] sqlstate_value,這個同毛病代碼相似構成逐個對應的關系,它是一個5個字符構成的字符串,症結的處所是它從ANSI SQL和ODBC這些尺度中援用過去的,是以加倍尺度化,而不像下面的error_code完整是mysql本身界說給本身用的,這個和第一個相似也能夠 參考mysql數據庫毛病代碼及信息。
3、condtion_name,這個是前提稱號,它應用DECLARE...CONDITION語句來界說,這個前面我們會引見若何界說本身的condition_name。
4、SQLWARNING,表現SQLTATE中的字符串以‘01'肇端的那些毛病,好比Error: 1311 SQLSTATE: 01000 (ER_SP_UNINIT_VAR)
5、NOT FOUND,表現SQLTATE中的字符串以‘02'肇端的那些毛病,好比Error: 1329 SQLSTATE: 02000 (ER_SP_FETCH_NO_DATA)
6、SQLEXCEPTION,表現SQLSTATE中的字符串不是以'00'、'01'、'02' 肇端的那些毛病,這裡'00'肇端的SQLSTATE其實表現的是勝利履行而不是毛病,別的兩個就是下面的4和5的兩種情形。
下面的6種情形其實可以分為兩類:
一類就是比擬明白的處置,就是對指定的毛病情形停止處置,包含1、2、3這三種方法;
另外一類是對對應類型的毛病的 處置,就是對某一群毛病的處置,包含4、5、6這三種方法。這個是引見了condition_value。別的還要留意的一個內容是MySQL在默許情形 下(也就是我們沒有界說處置毛病的辦法-handler)本身的毛病處置機制:
1、關於SQLWARNING和NOT FOUND的處置辦法就是疏忽毛病持續履行,所以在游標的例子外面假如我們沒有對repeat的前提斷定的誰人值做個no_more_products=1的handler來處置,那末輪回就會一向下去。
2、關於SQLEXCEPTION的話,其默許的處置辦法是在湧現毛病的處所就終止失落了。
b、statement,這個比擬簡略就是當湧現某種前提/毛病時,我們要履行的語句,可所以簡略的如 SET var = value如許的簡略的語句,也能夠是龐雜的多行的語句,多行的話可使用BEGIN ..... END這裡把語句包含在外面(這個比如delphi外面的情形,留意到我們的存儲進程也是多行的,所以也要BEGIN .... END)。
c、handler_action,這個表現當履行完下面的statement後,願望履行如何的舉措,這裡包含CONTINUE、EXIT、UNDO, 表現持續、加入、撤消(臨時不支撐)。這邊就是兩種舉措,其實這兩種舉措在下面也說過了,CONTINUE就是一個是SQLWARNING和NOT FOUND的默許處置辦法,而EXIT就是SQLEXCEPTION的默許處置辦法。
另:
condition_name:定名前提
MySQL error code或許SQLSTATE code的可讀性太差,所以引入了定名前提:
語法:
DECLARE condition_name CONDITION FOR condition_value condition_value: SQLSTATE [VALUE] sqlstate_value | mysql_error_code
應用:
# 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;
示例:
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;
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。