帶你輕松接觸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)

 
帶你輕松接觸一個數據庫的備份和恢複程序
在我們做數據庫系統的程序時,經常需要爲客戶做一個數據庫的備份和恢複程序,特別是對于一些非專業的數據庫用戶,這個程序更是必不可少,而且操作必需足夠簡單。因爲在很多系統中,數據庫的備份恢複功能都是相近的,...查看完整版>>帶你輕松接觸一個數據庫的備份和恢複程序
 
恢複忘記的MySQL 5.0數據庫的root密碼
一個最簡單的恢複方法: SET PASSWORD FOR = PASSWORD('123456'); 把上面這段文件!另存爲sql.txt 存放在任意文件夾 我這裏是存放在E:\sevser\下 在“運行”裏執行 E:\sevser\mysql\bin\mysqld-nt --init-file=E:\se...查看完整版>>恢複忘記的MySQL 5.0數據庫的root密碼
 
親密接觸ASP.Net(7)數據庫的應用
上一節,我們簡單的講了一下數據庫的應用,而我們沒有具體說明執行語句如何用于顯示。呵呵,是留在這一章節中講的。這裏我們必須得了解一下DataReader,DataSet和DataGrid控件,DataGrid是顯示控件,大家自已去看它相...查看完整版>>親密接觸ASP.Net(7)數據庫的應用
 
初次接觸JSP(win2k server)--JSP連接MYSQL數據庫
第一步你已經完成了,但是我想,那個只是最基礎的。最迫切想知道的,就是怎麽與數據庫聯系起來。因爲,不管是做留言本還是論壇,都會涉及到數據庫。其實,這一切都很簡單。首先確定你已經安裝了MYSQL數據庫,之所以選...查看完整版>>初次接觸JSP(win2k server)--JSP連接MYSQL數據庫
 
帶你輕松接觸一個檢測MySQL狀態的腳本
下面的這個腳本用到了namp掃描工具,所以,系統中如果沒安裝nmap掃描工具的,需要先安裝該工具。 腳本的功能: 首先,檢測mysql端口是否正常存在,端口不存在就執行啓動mysql服務,當然,啓動的腳本的位置根據你的安裝路徑會...查看完整版>>帶你輕松接觸一個檢測MySQL狀態的腳本
 
· 臨近國慶,李小璐與女兒在天安門前合影

http://image.wangchao.net.cn/users/...

· 震驚!原來酒駕處罰這麽嚴重

酒駕處罰標准 不要有任何一絲僥幸心理! http://image....

· 把年齡相仿的獅虎熊放一起,誰更厲害?結果出人意料

很多人都想知道獅子、老虎和熊打起來誰最厲害,于是便有好事之人把這三種動物關在一起...