程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 帶你輕松接觸MySQL數據庫的異常處理

帶你輕松接觸MySQL數據庫的異常處理

編輯:關於MYSQL數據庫

  對於MySQL的異常處理,本人不常用。不過我覺得還是有寫下來的必要。

  標准格式

 DECLARE handler_type HANDLER FOR condition_value[,...] statement
  handler_type:
  CONTINUE
  | EXIT
  | UNDO --暫時不支持
  condition_value:
  SQLSTATE [VALUE] sqlstate_value
  | condition_name
  | SQLWARNING
  | NOT FOUND
  | SQLEXCEPTION
  | MySQL_error_code

  condition_value細節

  1、MySQL ERROR CODE 列表

  如果需要查看更多的錯誤列表可以直接到MySQL安裝路徑下。

  比如我的/usr/local/mysql/share/MySQL/errmsg.txt

  說明:SQLSTATE [VALUE] sqlstate_value這種格式是專門為ANSI SQL 和 ODBC以及其他的標准.

  並不是所有的MySQL ERROR CODE 都映射到SQLSTATE。

  2、假如不需要插入ERROR CODE,可以用速記條件來代替

  SQLWARNING 代表所有以01開頭的錯誤代碼

  NOT FOUND 代表所有以02開頭的錯誤代碼,當然也可以代表一個游標到達數據集的末尾。

  SQLEXCEPTION 代表除了SQLWARNING和NOT FOUND 的所有錯誤代碼。

  3、具體示例:

  create TABLE t (s1 int,primary key (s1));
  MySQL> use t_girl
  Database changed
  MySQL> create TABLE t (s1 int,primary key (s1));
  Query OK, 0 rows affected (0.00 sec)
  MySQL>
  MySQL>
  MySQL> DELIMITER ||
  MySQL> create PROCEDURE handlerdemo ()
  -> BEGIN
  -> DECLARE EXIT HANDLER FOR SQLSTATE ’23000’ BEGIN END; -- 遇到重復鍵值就退出
  -> SET @x = 1;
  -> insert INTO t VALUES (1);
  -> SET @x = 2;
  -> insert INTO t VALUES (1);
  -> SET @x = 3;
  -> END||
  Query OK, 0 rows affected (0.00 sec)
  MySQL> DELIMITER ;
  MySQL> call handlerdemo();
  Query OK, 0 rows affected (0.00 sec)
  MySQL> select @x;
  +------+
  | @x |
  +------+
  | 2 |
  +------+
  1 row in set (0.00 sec)
  MySQL> call handlerdemo();
  Query OK, 0 rows affected (0.00 sec)
  MySQL> select @x;
  +------+
  | @x |
  +------+
  | 1 |
  +------+
  1 row in set (0.00 sec)
  MySQL>

  遇到錯誤繼續的情況

  MySQL> truncate table t;
  Query OK, 0 rows affected (0.01 sec)
  MySQL> DELIMITER $$
  MySQL> drop PROCEDURE IF exists `t_girl`.`handlerdemo`$$
  Query OK, 0 rows affected (0.00 sec)
  MySQL> create DEFINER=`root`@`localhost` PROCEDURE `handlerdemo`()
  -> BEGIN
  -> DECLARE CONTINUE HANDLER FOR SQLSTATE ’23000’ BEGIN END;
  -> SET @x = 1;
  -> insert INTO t VALUES (1);
  -> SET @x = 2;
  -> insert INTO t VALUES (1);
  -> SET @x = 3;
  -> END$$
  Query OK, 0 rows affected (0.01 sec)
  MySQL> DELIMITER ;
  MySQL> call handlerdemo();
  Query OK, 0 rows affected (0.00 sec)
  MySQL> select @x;
  +------+
  | @x |
  +------+
  | 3 |
  +------+
  1 row in set (0.00 sec)
  MySQL> call handlerdemo();
  Query OK, 0 rows affected (0.00 sec)
  MySQL> select @x;
  +------+
  | @x |
  +------+
  | 3 |
  +------+
  1 row in set (0.00 sec)
  MySQL>

  我們可以看到,始終執行到最後。

  當然,上面的SQLSTATE ’23000’可以替換為1062。

  警告:

  MySQL> alter table t add s2 int not null;
  Query OK, 0 rows affected (0.01 sec)
  Records: 0 Duplicates: 0 Warnings: 0

  這個列沒有默認值,插入的時候會出現警告或者1364錯誤提示。

  MySQL> DELIMITER $$
  MySQL> drop PROCEDURE IF exists `t_girl`.`handlerdemo`$$
  Query OK, 0 rows affected, 1 warning (0.00 sec)
  MySQL> create DEFINER=`root`@`localhost` PROCEDURE `handlerdemo`()
  -> BEGIN
  -> DECLARE CONTINUE HANDLER FOR 1062 BEGIN END;
  -> DECLARE CONTINUE HANDLER FOR SQLWARNING
  -> BEGIN
  -> update t set s2 = 2;
  -> END;
  -> DECLARE CONTINUE HANDLER FOR 1364
  -> BEGIN
  -> insert INTO t(s1,s2) VALUES (1,3);
  -> END;
  -> SET @x = 1;
  -> insert INTO t(s1) VALUES (1);
  -> SET @x = 2;
  -> insert INTO t(s1) VALUES (1);
  -> SET @x = 3;
  -> END$$
  Query OK, 0 rows affected (0.00 sec)
  MySQL> DELIMITER ;
  MySQL> call handlerdemo();
  Query OK, 0 rows affected (0.00 sec)
  MySQL> select * from t;
  +----+----+
  | s1 | s2 |
  +----+----+
  | 1 | 3 |
  +----+----+

  1 row in set (0.00 sec)

  遇到錯誤時,插入的新記錄。

  MySQL> select @x;

  +------+

  | @x |

  +------+

  | 3 |

  +------+

  1 row in set (0.00 sec)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved