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...