MySQL存儲過程中一些基本的異常處理教程
有時候,不希望存儲過程拋出錯誤中止執(zhí)行,而是希望返回一個錯誤碼。 Mysql 支持異常處理,通過定義 CONTINUE/EXIT 異常處理的 HANDLER 來捕獲 SQLWARNING/NOT FOUND/SQLEXCEPTION (警告 / 無數(shù)據(jù) / 其他異常)。其中, 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;
經(jīng)過異常處理后,可以避免拋出錯誤,而是定義一個返回參數(shù) o_ret 賦予特殊值來表示失敗,這樣,比如在 java 代碼中,可以通過獲取返回值而不是捕獲異常的方式來處理業(yè)務邏輯。例如將返回值設置為 -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()//
相關文章
詳細介紹基于MySQL的搜索引擎MySQL-Fullltext
這篇文章主要詳細介紹基于MySQL的搜索引擎MySQL-Fullltext,需要用到C和C#以及JavaScript的知識,屬于MySQL的高階應用,需要的朋友可以參考下2015-04-04MYSQL如何 查詢數(shù)據(jù)庫中所有表中的數(shù)據(jù)量
INFORMATION_SCHEMA.TABLES 是 MySQL 中的系統(tǒng)表,用于存儲關于數(shù)據(jù)庫中的表的信息,這篇文章主要介紹了MYSQL如何 查詢數(shù)據(jù)庫中所有表中的數(shù)據(jù)量,需要的朋友可以參考下2024-01-01MySql 快速插入千萬級大數(shù)據(jù)的方法示例
這篇文章主要介紹了MySql 快速插入千萬級大數(shù)據(jù)的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08MySQL slave_net_timeout參數(shù)解決的一個集群問題案例
這篇文章主要介紹了MySQL slave_net_timeout參數(shù)解決的一個集群問題案例,問題日志請見正文,本文使用slave_net_timeout參數(shù)解決了這個問題,需要的朋友可以參考下2015-05-05