文章目錄
20.2.10. 條件和處理常式
20.2.10.1. DECLARE條件
20.2.10.2. DECLARE處理常式
特定條件需要特定處理。這些條件可以聯絡到錯誤,以及子程式中的一般流程式控制制。
20.2.10.1. DECLARE條件
DECLARE condition_name CONDITION FOR condition_value
condition_value:
SQLSTATE [VALUE] sqlstate_value
| mysql_error_code
這個語句指定需要特殊處理的條件。它將一個名字和指定的錯誤條件關聯起來。這個名字可以隨後被用在DECLARE HANDLER語句中。請參閱20.2.10.2節,“DECLARE處理常式”。
除了SQLSTATE值,也支援MySQL錯誤碼。
20.2.10.2. DECLARE處理常式
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
handler_type:
CONTINUE
| EXIT
| UNDO
condition_value:
SQLSTATE [VALUE] sqlstate_value
| condition_name
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION
| mysql_error_code
這個語句指定每個可以處理一個或多個條件的處理常式。如果產生一個或多個條件,指定的語句被執行。
對一個CONTINUE處理常式,當前子程式的執行在執行 處理常式語句之後繼續。對於EXIT處理常式,當前BEGIN...END複合陳述式的執行被終止。UNDO 處理常式類型語句還不被支援。
· SQLWARNING是對所有以01開頭的SQLSTATE代碼的速記。
· NOT FOUND是對所有以02開頭的SQLSTATE代碼的速記。
· SQLEXCEPTION是對所有沒有被SQLWARNING或NOT FOUND捕獲的SQLSTATE代碼的速記。
除了SQLSTATE值,MySQL錯誤碼也不被支援。
例如:
mysql> CREATE TABLE test.t (s1 int,primary key (s1));
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter //
mysql> CREATE PROCEDURE handlerdemo ()
-> BEGIN
-> DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;
-> SET @x = 1;
-> INSERT INTO test.t VALUES (1);
-> SET @x = 2;
-> INSERT INTO test.t VALUES (1);
-> SET @x = 3;
-> END;
-> //
Query OK, 0 rows affected (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)
注意到,@x是3,這表明MySQL被執行到程式的末尾。如果DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; 這一行不在,第二個INSERT因PRIMARY KEY強制而失敗之後,MySQL可能已經採取 預設(EXIT)路徑,並且SELECT @x可能已經返回2。