国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

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

2024-07-24 12:58:00
字體:
來源:轉載
供稿:網友
對于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)


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 晋宁县| 柳州市| 富民县| 五峰| 深泽县| 嘉义县| 静宁县| 宁波市| 九龙县| 灵川县| 枣阳市| 乐至县| 新郑市| 邳州市| 五峰| 东山县| 山丹县| 石屏县| 登封市| 西峡县| 三江| 久治县| 临清市| 柏乡县| 岢岚县| 新沂市| 肥乡县| 丰原市| 罗江县| 东山县| 于田县| 九龙县| 忻州市| 岑巩县| 吉安县| 佛山市| 洞口县| 留坝县| 边坝县| 宜君县| 揭阳市|