mysql儲存過程中的異常處理

2021-09-07 22:39:49 字數 2453 閱讀 5765

定義異常捕獲型別及處理方法:

declarehandler_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 | notfound | 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。

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的預設處理方法。另:

declare condition_name condition forcondition_value  

condition_value:

sqlstate [value]sqlstate_value | mysql_error_code

使用:

# original  

declare continue handler for 1216mysql_statements; # changed declare foreign_key_error condition for 1216; declare continue handler for foreign_key_error mysql_statements;

示例:

create proceduresp_add_location  

(in_location varchar(30), in_address1 varchar(30), in_address2 varchar(30), zipcode varchar(10), out out_status varchar(30)) begin declare continuehandler for 1062 set out_status='duplicate entry'; set out_status='ok'; insert intolocations (location,address1,address2,zipcode) values(in_location,in_address1,in_address2,zipcode); end;

mysql儲存過程中的異常處理

定義異常捕獲型別及處理方法 declarehandler action handler for condition value condition value statement handler action continue exit undo condition value mysql erro...

Oracle儲存過程中的異常處理

1.問題 oracle中可以用dbms output.put line來列印提示資訊,但是很容易緩衝區就溢位了。可以用dbms output.enable 1000000 來設定緩衝區的大小。但是有大小,就有可能再溢位 程式寫得太爛,錯誤不斷,不好意思 於是想把異常資訊寫到乙個表中。2.建表 這個容...

Mysql的儲存過程中的異常

以前看到一篇mysql的儲存過程,覺得很簡單 要使用mysql的儲存過程,需要 1 mysql的版本在5.0以上,低版本的海不支援儲存過程 2 資料表應該是innodb的,其他格式的不支援事務 做乙個實驗 建立兩個表,在儲存過程中向兩個表插入資料,使向第一表的插入操作執行成功,向第二個表的操作執行失...