異常處理可用在子程式中的一般流程控制。當我們希望對sql執行過程中出現的錯誤情況進行處理,就可以用到異常處理。如針對儲存過程 、觸發器或函式內部語句可能發生的錯誤或警告資訊,需要進行相關異常或稱異常的捕獲,然後作出相應的處理。
一、條件和處理程式
1、declare條件
語法:declare 條件名稱 condition for 條件值
條件值有如下取值:
sqlstate_value引數和mysql_error_code引數都可以表示mysql的錯誤。例如error 1146 (42s02)中,sqlstate_value值是42s02,mysql_error_code值是1146。這個語句指定需要特殊處理的條件。它將乙個名字和指定的錯誤條件關聯起來。這個名字可以隨後被用在declare handler語句中。
**:
--一:使用sqlstate_value
declare can_not_find condition for sqlstate '
42s02
';
--二:使用mysql_error_code
declare can_not_find condition for
1146 ;
2、declare處理程式
語法:declare 處理型別 handler for 引數錯誤型別[,...] sp_statement
處理型別有如下取值:
引數錯誤型別有如下取值:
**:
--一:捕獲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 sqlstate '
42s02';
--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
';
二、例項
向表中插入重複的一條記錄,由於id相同,會產生異常,此時我們可以進行異常處理。
1------------------------------2--
table structure for course3--
----------------------------
4drop
table
ifexists
`course`;
5create
table
`course` (
6 `id` int(11) not
null
,7 `name` varchar(255) not
null
,8 `score` int(11) not
null,9
primary
key(`id`)
10 ) engine=innodb default charset=
utf8;
1112
13drop
procedure
ifexists
proc_test_exce;
14create
procedure
proc_test_exce(
15in uid int(11
),16
in uname varchar(255
),17
in uscore int(11
),18 out result int(11)19
)20begin
21--
declare exit handler for sqlstate '23000' set result = -1;
22declare
exit handler for sqlwarning,not found,sqlexception set result=-1;
23 start transaction
;
24insert
into course (id, name, score) values
(uid, uname, uscore);
25set result =
1;
26commit
; 27
end;
2829
--id 相同則返回-1
30 call proc_test_exce(3 ,'
中文', 34, @result
);31
select
@result;
連續執行call proc_test_exce(3 ,'中文', 34, @result);兩次,第一次reuslt返回1,第二次返回-1。因為id衝突,執行到24行,就不會再退出,不會再往下執行,而會執行22行。所以第二次返回的是-1。
五 條件控制語句
執行流程 如果為false,則不執行。例如 num 50 if num 20 print num比20大 輸出 num比20大 語法 if 條件表示式 塊input rint 123 輸出 123username input if usename admin 輸出 沒有提示 admin userna...
shell程式設計(五)條件判斷
這裡所說的條件判斷是對變數的大小 字串 檔案屬性等內容進行判斷。test命令可以用於字串 數字 檔案狀態等內容的測試。指的是對檔案的許可權 有無 屬性 型別等內容進行判斷。與其他語言不同的是,test命令的測試結果,返回0時表示測試成功。返回1時表示測試失敗。指的是比較兩個數值的大小或相等關係,相當...
Linux 執行緒 五 (條件變數)
我們先看一下條件變數的api 條件變數 1.定義條件變數 pthread cond t cond 2.初始化 pthread cond init cond,null 3.等待條件 pthread cond wait cond,mutex 1 mutex 如果沒有在互斥環境,形同虛設 2 如果在,wa...