有時候,不希望預存程序拋出錯誤中止執行,而是希望返回一個錯誤碼。
Mysql
支援異常處理,通過定義
CONTINUE/EXIT
異常處理的
HANDLER
來捕獲
SQLWARNING/NOT FOUND/SQLEXCEPTION
(警告
/
無資料
/
其他異常)。其中,
FOR
後面可以改為
SQLWARNING,
NOT FOUND, SQLEXCEPTION
來指示所有異常都處理,相當於
oracle
中的
others
。例如,當不進行異常處理時,以下代碼將直接拋出一個
ERROR 1062 (23000)
錯誤:
Sql
code 4-1:
CREATE PROCEDURE test_proc_ins1(<br /> IN i_id INT,<br /> IN i_name VARCHAR(100)<br />)<br />BEGIN<br /> INSERT INTO testproc VALUES (i_id,i_name);<br /> INSERT INTO testproc VALUES (i_id,i_name);<br />END;
經過異常處理後,可以避免拋出錯誤,而是定義一個返回參數
o_ret
賦予特殊值來表示失敗,這樣,在
java
代碼中,可以通過擷取傳回值而不是捕獲異常的方式來處理商務邏輯。例如將傳回值設定為
-1:
Sql
code 4-2:
CREATE PROCEDURE test_proc_ins1(<br /> IN i_id INT,<br /> IN i_name VARCHAR(100),<br /> OUT o_ret INT)<br />BEGIN<br /> DECLARE EXIT HANDLER FOR SQLSTATE '23000' set o_ret = -1;<br />-- 也可以這樣使用:<br />-- DECLARE EXIT HANDLER FOR SQLWARNING,NOT FOUND,SQLEXCEPTION set o_ret=-1;<br /> INSERT INTO testproc VALUES (i_id,i_name);<br /> INSERT INTO testproc VALUES (i_id,i_name);<br /> set o_ret = 1;<br />END;