您好,登錄后才能下訂單哦!
這篇文章主要介紹MySQL 5.5新增SIGNAL異常處理怎么用,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
MySQL 5.5新增SIGNAL異常處理
MySQL 從 5.0 開(kāi)始支持存儲(chǔ)過(guò)程,到現(xiàn)在最新版本5.5 已經(jīng)好幾個(gè)年頭了。 雖然MYSQL的異常處理不是很完善,但是處理大多數(shù)的應(yīng)用還是足夠了。
異常處理的語(yǔ)句有如下幾種:
1. DECLARE ... CONDITION.
2. DECLARE ... HANDLER.
3. RESIGNAL.
4. SIGNAL.
第一種,名為條件聲明。
DECLARE condition_name CONDITION FOR condition_value
這里condition_name 為標(biāo)準(zhǔn)的變量命名, condition_value 為SQLSTATE 值 或者 MySQL 自身的ERROR CODE.
單獨(dú)的condition 語(yǔ)句不能直接運(yùn)行。 只能作為第二種的一部分。
www.2cto.com
第二種, 名為條件處理。
第一種聲明好了,接下來(lái)自然要做相應(yīng)的處理。
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 代表處理的動(dòng)作,目前有效的有兩種, 繼續(xù)和直接退出。
condition_value 有好幾種,其中包括前面條件聲明里的SQLSTATE, MYSQL EEROR CODE, condition_name 以及范圍混淆的其他兩種
SQLWARNING,SQLEXCEPTION. NOT FOUND表示任何不存在的WARNING或者ERROR。
第三種, 代表偽裝系統(tǒng)的錯(cuò)誤信息以及代碼,刷新當(dāng)前警告緩沖區(qū)域。
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 = simple_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
特別注意的是可以偽裝的具體東西很多,包括錯(cuò)誤代碼(MYSQL自身的東東),錯(cuò)誤內(nèi)容,錯(cuò)誤的名,表名,列名等等。
第四種,SIGNAL和RESIGNAL差別不大,我們記住signal 不能單獨(dú)運(yùn)行,resignal可以單獨(dú)運(yùn)行。
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 = simple_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
我們現(xiàn)在給幾個(gè)例子。
不用RESIGNAL/SIGNAL。
[sql]
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 重刷當(dāng)前錯(cuò)誤診斷區(qū)域。
[sql]
DELIMITER $$
www.2cto.com
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!',
_errno = 22;
/*
signal con1 SET schema_name = 'action',
table_name = 'action_tb',
message_text = 'Duplicated!',
mysql_errno = 22;
www.2cto.com
*/
END;
INSERT INTO user_info VALUES (f_id);
END$$
DELIMITER ;
CALL sp_signal1(12);
www.2cto.com
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新增SIGNAL異常處理怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。