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

  異常處理可用在子程序中的通常流程控制。當咱們但願對sql執行過程當中出現的錯誤狀況進行處理,就能夠用到異常處理。如針對存儲過程 、觸發器或函數內部語句可能發生的錯誤或警告信息,須要進行相關異常或稱異常的捕獲,而後做出相應的處理。html

1、條件和處理程序mysql

  一、DECLARE條件sql

  語法:函數

  DECLARE 條件名稱 CONDITION FOR 條件值ui

  條件值有以下取值:spa

  •   SQLSTATE [VALUE] sqlstate_value
  •   mysql_error_code

  sqlstate_value參數和mysql_error_code參數均可以表示MySQL的錯誤。例如ERROR 1146 (42S02)中,sqlstate_value值是42S02,mysql_error_code值是1146。這個語句指定須要特殊處理的條件。它將一個名字和指定的錯誤條件關聯起來。這個名字能夠隨後被用在DECLARE HANDLER語句中。code

  代碼:server

-- 一:使用sqlstate_value  
DECLARE  can_not_find  CONDITION  FOR  SQLSTATE  '42S02' ;  
-- 二:使用mysql_error_code  
DECLARE  can_not_find  CONDITION  FOR  1146 ;

  二、DECLARE處理程序htm

  語法:
  DECLARE 處理類型 HANDLER FOR 參數錯誤類型[,...] sp_statementblog

  處理類型有以下取值:

  •   CONTINUE  :錯誤不進行處理,繼續向下執行。
  •   EXIT  :遇到錯誤後立刻退出。
  •   UNDO    : 遇到錯誤後撤回以前的操做,MySQL中暫時還不支持這種處理方式。

 參數錯誤類型有以下取值:

  • SQLSTATE [VALUE] qlstate_value :這種格式是專門爲ANSI SQL 和 ODBC以及其餘的標準. 並非全部的MySQL ERROR CODE 都映射到SQLSTATE。 
  • condition_name :DECLARE條件的條件名稱
  • SQLWARNING :對全部以01開頭的SQLSTATE代碼的速記。
  • NOT FOUND :是對全部以02開頭的SQLSTATE代碼的速記,固然也能夠表明一個遊標到達數據集的末尾。 
  • SQLEXCEPTION :是對全部沒有被SQLWARNING或NOT FOUND捕獲的SQLSTATE代碼的速記。
  • mysql_error_code:經常使用mysql_error_code 列表http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html

   代碼:

    -- 一:捕獲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'; 

2、實例

  向表中插入重複的一條記錄,因爲id相同,會產生異常,此時咱們能夠進行異常處理。

 1 -- ----------------------------
 2 -- Table structure for course
 3 -- ----------------------------
 4 DROP TABLE IF EXISTS `course`;
 5 CREATE 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;
11 
12 
13 DROP PROCEDURE IF EXISTS proc_test_exce;
14 CREATE PROCEDURE proc_test_exce(
15     IN uid INT(11),
16     IN uname VARCHAR(255),
17     IN uscore INT(11),
18     OUT result INT(11)
19 )
20 BEGIN 
21     -- DECLARE EXIT HANDLER FOR SQLSTATE '23000' set result = -1; 
22     DECLARE EXIT HANDLER FOR SQLWARNING,NOT FOUND,SQLEXCEPTION set result=-1; 
23     START TRANSACTION;        
24         INSERT INTO course (id, name, score) VALUES(uid, uname, uscore);
25         set result = 1;  
26     COMMIT; 
27 END;
28 
29 -- 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。

相關文章
相關標籤/搜索