儲存過程之五 條件和異常處理

2021-09-06 17:43:18 字數 3142 閱讀 5095

異常處理可用在子程式中的一般流程控制。當我們希望對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...