溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL 5.5新增SIGNAL異常處理怎么用

發(fā)布時(shí)間:2022-01-14 17:15:43 來(lái)源:億速云 閱讀:170 作者:小新 欄目:數(shù)據(jù)庫(kù)

這篇文章主要介紹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è)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI