mysql儲存函式,遊標的使用過程中異常捕捉機制
阿新 • • 發佈:2019-01-21
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';