1. 程式人生 > >mysql儲存函式,遊標的使用過程中異常捕捉機制

mysql儲存函式,遊標的使用過程中異常捕捉機制

drop procedure if exists p2;
delimiter $$
create procedure p2()
--建立一個函式
begindeclare row_player_guid int ;--定義一個變數用來接收遊標返回的值
declare done int default false;--定義一個值,用來判定迴圈的狀態,ture就跳出迴圈
declare get cursor for select distinct(player_guid) from p_task;
declare exit handler for not found set done=true;--異常捕捉,
declare continue handler for 1062 set @info='Duplicate entry';--異常捕捉continue為忽略這個錯誤繼續執行
open get;--開啟遊標read_loop: LOOP--建立迴圈遍歷結果集(建立遊標時定義的)
fetch get into row_player_guid;--將遍歷的結果賦值給row_player_guid
IF done THEN--遊標結束的條件
LEAVE read_loop;
END IF;--遊標結束的條件也可以不加,不加的話需要把異常捕捉的continue換成exit
--想要在迴圈內做的事情
select row_player_guid,done; 
END LOOP;   
close get;  --關閉遊標
end $$
delimiter;

DECLARE handler_type HANDLER FOR condition_value [,...] sp_statement
handler_type: CONTINUE|EXIT|UNDO
--handler_type為錯誤處理方式,引數為3個值之一;
--CONTINUE表示遇到錯誤不處理,繼續執行;
--EXIT表示遇到錯誤時馬上退出;
--舉例:
//方法一:捕獲sqlstate_value異常
//這種方法是捕獲sqlstate_value值。如果遇到sqlstate_value值為"42S02",執行CONTINUE操作,並輸出"NO_SUCH_TABLE"資訊
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info='NO_SUCH_TABLE';
//方法二:捕獲mysql_error_code異常
//這種方法是捕獲mysql_error_code值。如果遇到mysql_error_code值為1146,執行CONTINUE操作,並輸出"NO_SUCH_TABLE"資訊;
DECLARE CONTINUE HANDLER FOR 1146 SET @info='NO_SUCH_TABLE';
//方法三:先定義條件,然後捕獲異常
DECLARE no_such_table CONDITION FOR 1146;
DECLARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info='NO_SUCH_TABLE';
//方法四:使用SQLWARNING捕獲異常
DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR';
//方法五:使用NOT FOUND捕獲異常
DECLARE EXIT HANDLER FOR NOT FOUND SET @info='NO_SUCH_TABLE';
//方法六:使用SQLEXCEPTION捕獲異常
DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';