mysql儲存過程異常處理

2021-06-21 21:05:49 字數 3100 閱讀 9330

定義條件和處理程式是事先定義程式執行過程中可能遇到的問題。並且可以在處理程式中定**決這些問題的辦法。這種方式可以提前**可能出現的問題,並提出解決辦法。這樣可以增強程式處理問題的能力,避免程式異常停止。mysql中都是通過declare關鍵字來定義條件和處理程式。本小節中將詳細講解如何定義條件和處理程式。

1.定義條件

mysql中可以使用declare關鍵字來定義條件。其基本語法如下:

declare  condition_name  condition  for  condition_value  

condition_value:  

sqlstate [value] sqlstate_value | mysql_error_code 

其中,condition_name引數表示條件的名稱;condition_value引數表示條件的型別;sqlstate_value引數和mysql_error_code引數都可以表示mysql的錯誤。例如error 1146 (42s02)中,sqlstate_value值是42s02,mysql_error_code值是1146。

【示例14-6】 下面定義"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 ; 

2.定義處理程式

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引數指明錯誤的處理方式,該引數有3個取值。這3個取值分別是continue、exit和undo。continue表示遇到錯誤不進行處理,繼續向下執行;exit表示遇到錯誤後馬上退出;undo表示遇到錯誤後撤回之前的操作,mysql中暫時還不支援這種處理方式。

注意:通常情況下,執行過程中遇到錯誤應該立刻停止執行下面的語句,並且撤回前面的操作。但是,mysql中現在還不能支援undo操作。因此,遇到錯誤時最好執行exit操作。如果事先能夠**錯誤型別,並且進行相應的處理,那麼可以執行continue操作。

condition_value引數指明錯誤型別,該引數有6個取值。sqlstate_value和mysql_error_code與條件定義中的是同乙個意思。condition_name是declare定義的條件名稱。sqlwarning表示所有以01開頭的sqlstate_value值。not found表示所有以02開頭的sqlstate_value值。sqlexception表示所有沒有被sqlwarning或not found捕獲的sqlstate_value值。sp_statement表示一些儲存過程或函式的執行語句。

【示例14-7】 下面是定義處理程式的幾種方式。**如下:

//方法一:捕獲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'

;  //方法三:先定義條件,然後呼叫  

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種定義處理程式的方法。第一種方法是捕獲sqlstate_value值。如果遇到sqlstate_value值為42s02,執行continue操作,並且輸出"can not find"資訊。第二種方法是捕獲mysql_error_code值。如果遇到mysql_error_code值為1146,執行continue操作,並且輸出"can not find"資訊。第三種方法是先定義條件,然後再呼叫條件。這裡先定義can_not_find條件,遇到1146錯誤就執行continue操作。第四種方法是使用sqlwarning。sqlwarning捕獲所有以01開頭的sqlstate_value值,然後執行exit操作,並且輸出"error"資訊。第五種方法是使用not found。not found捕獲所有以02開頭的sqlstate_value值,然後執行exit操作,並且輸出"can not find"資訊。第六種方法是使用sqlexception。sqlexception捕獲所有沒有被sqlwarning或not found捕獲的sqlstate_value值,然後執行exit操作,並且輸出"error"資訊。

儲存過程 異常處理continue

drop table if exists t2 create table t2 s1 int,primary key s1 engine innodb delete from t2 drop procedure if exists p23 delimiter create procedure p23...

ORACLE儲存過程異常處理。

create or replace procedure p tx getfaxdata as v errorcode number 出錯的 v errormsg varchar2 200 錯誤的訊息顯示 v currentuser varchar2 8 當前資料庫使用者 v information ...

mssql儲存過程異常處理

mssql2000和mssql2005以上版本的異常處理語法是不相同的。sql server 2005以上版本支援結構化異常處理,而mssql2000是不支援的。1 先看mssql 2000的異常處理語法 create proc sp mssql2000 titlename nvarchar 128...