MySQL 5 5 新增SIGNAL異常處理

2021-06-08 04:51:05 字數 3950 閱讀 8037

mysql 從 5.0 開始支援儲存過程,到現在最新版本5.5 已經好幾個年頭了。 雖然mysql的異常處理不是很完善,但是處理大多數的應用還是足夠了。

異常處理的語句有如下幾種:

1. declare ... condition.

2. declare ... handler.

3. resignal.

4. signal.

declare condition_name condition for condition_value

這裡condition_name 為標準的變數命名, condition_value 為sqlstate 值 或者 mysql 自身的error code.

單獨的condition 語句不能直接執行。 只能作為第二種的一部分。

第一種宣告好了,接下來自然要做相應的處理。

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

handler_action 代表處理的動作,目前有效的有兩種, 繼續和直接退出。

condition_value 有好幾種,其中包括前面條件宣告裡的sqlstate, mysql eeror code, condition_name 以及範圍混淆的其他兩種

sqlwarning,sqlexception. not found表示任何不存在的warning或者error。

resignal [condition_value]

[set signal_information_item

[, signal_information_item] ...]

condition_value:

sqlstate [value] sqlstate_value

| condition_name

signal_information_item:

condition_information_item_name = ******_value_specification

condition_information_item_name:

class_origin

| subclass_origin

| message_text

| mysql_errno

| constraint_catalog

| constraint_schema

| constraint_name

| catalog_name

| schema_name

| table_name

| column_name

| cursor_name

特別注意的是可以偽裝的具體東西很多,包括錯誤**(mysql自身的東東),錯誤內容,錯誤的資料庫名,表名,列名等等。

signal condition_value

[set signal_information_item

[, signal_information_item] ...]

condition_value:

sqlstate [value] sqlstate_value

| condition_name

signal_information_item:

condition_information_item_name = ******_value_specification

condition_information_item_name:

class_origin

| subclass_origin

| message_text

| mysql_errno

| constraint_catalog

| constraint_schema

| constraint_name

| catalog_name

| schema_name

| table_name

| column_name

| cursor_name

我們現在給幾個例子。

不用resignal/signal。

delimiter $$

use `t_girl`$$

drop procedure if exists `sp_signal1`$$

create definer=`root`@`localhost` procedure `sp_signal1`(

in f_id int

)begin

declare con1 tinyint default 0;

declare con1 condition for sqlstate '23000';

declare continue handler for con1

begin

select 'error code : 22\r\nduplicated!';

end;

insert into user_info values (f_id);

end$$

delimiter ;

call sp_signal1(12);

query result

result

error code : 22

duplicated!

用resignal/signal 重刷當前錯誤診斷區域。

delimiter $$

use `t_girl`$$

drop procedure if exists `sp_signal1`$$

create definer=`root`@`localhost` procedure `sp_signal1`(

in f_id int

)begin

declare con1 tinyint default 0;

declare con1 condition for sqlstate '23000';

declare continue handler for con1

begin

resignal set schema_name = 'action',

table_name = 'action_tb',

message_text = 'duplicated!',

mysql_errno = 22;

/*

signal con1 set schema_name = 'action',

table_name = 'action_tb',

message_text = 'duplicated!',

mysql_errno = 22;

*/ end;

insert into user_info values (f_id);

end$$

delimiter ;

call sp_signal1(12);

query : call sp_signal1(12)

error code : 22

duplicated!

execution time : 00:00:00:000

transfer time  : 00:00:00:000

total time     : 00:00:00:000

mysql 5 5傳馬 mysql5 5安裝文件

groupadd mysql useradd r g mysql mysql mkdir home mysql mkdir p data mysql chown mysql mysql r data mysql yum install y gcc gcc c libtool autoconf aut...

MySQL5 5密碼重置

1 停止mysql伺服器 執行輸入services.msc 停止mysql服務 2 在cmd下 輸入 mysqld skip grant tables 啟動伺服器 游標不動 不要關閉該視窗 3 新開啟cmd 輸入mysql u root p 不需要密碼 use mysql update user s...

編譯安裝MySQL 5 5

編譯安裝mysql 5.5 cmake的重要特性之一是其獨立於原始碼 out of source 的編譯功能,即編譯工作可以在另乙個指定的目錄中而非原始碼目錄中進行,這可以保證原始碼目錄不受任何一次編譯的影響,因此在同乙個原始碼樹上可以進行多次不同的編譯,如針對於不同平台編譯。編譯安裝mysql 5...