MySQL存儲進程中一些根本的異常處置教程。本站提示廣大學習愛好者:(MySQL存儲進程中一些根本的異常處置教程)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL存儲進程中一些根本的異常處置教程正文
有時刻,不願望存儲進程拋失足誤中斷履行,而是願望前往一個毛病碼。 Mysql 支撐異常處置,經由過程界說 CONTINUE/EXIT 異常處置的 HANDLER 來捕捉 SQLWARNING/NOT FOUND/SQLEXCEPTION (正告 / 有數據 / 其他異常)。個中, FOR 前面可以改成 SQLWARNING, NOT FOUND, SQLEXCEPTION 來指導一切異常都處置,相當於 oracle 中的 others 。例如,當不停止異常處置時,以下代碼將直接拋出一個 ERROR 1062 (23000) 毛病:
CREATE PROCEDURE test_proc_ins1( IN i_id INT, IN i_name VARCHAR(100) ) BEGIN INSERT INTO testproc VALUES (i_id,i_name); INSERT INTO testproc VALUES (i_id,i_name); END;
經由異常處置後,可以免拋失足誤,而是界說一個前往參數 o_ret 付與特別值來表現掉敗,如許,好比在 java 代碼中,可以經由過程獲得前往值而不是捕捉異常的方法來處置營業邏輯。例如將前往值設置為 -1:
CREATE PROCEDURE test_proc_ins1( IN i_id INT, IN i_name VARCHAR(100), OUT o_ret INT) BEGIN DECLARE EXIT HANDLER FOR SQLSTATE '23000' set o_ret = -1; -- 也能夠如許應用: -- DECLARE EXIT HANDLER FOR SQLWARNING,NOT FOUND,SQLEXCEPTION set o_ret=-1; INSERT INTO testproc VALUES (i_id,i_name); INSERT INTO testproc VALUES (i_id,i_name); set o_ret = 1; END;
固然,關於特定的SQL語句,也能夠指定好比主鍵抵觸,就rollback;
DECLARE exit HANDLER FOR SQLSTATE '23000' delimiter // CREATE PROCEDURE TEST() BEGIN DECLARE exit HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND begin rollback; insert into bb values('error'); end; START TRANSACTION; INSERT INTO aa VALUES (1); INSERT INTO aa VALUES (2); COMMIT; END; // CALL test()//