錯誤異常處理:
語法如下:
declare {exit | continue} handler for {error-number | {sqlstate error-string} | condition } sql statement
這個語句指定了每個可以處理一個或多個條件的處理程序。如果產生一個或多個條件,則指定的語句將被執行,對於一個continue處理程序,當前子程序的執行將在執行處理程序語句之后繼續。對於exit處理程序,當前的begin...end 復合語句的執行將被終止。
實例一:
DELIMITER $$ USE `csp` $$ DROP PROCEDURE IF EXISTS `curdemo` $$ CREATE DEFINER = `root` @`%` PROCEDURE `curdemo` (IN p_source VARCHAR (100)) BEGIN -- 需要定義接收游標數據的變量 DECLARE done INT DEFAULT 0 ; -- 自定義變量 DECLARE var_price DOUBLE DEFAULT NULL ; DECLARE var_pay_time TIMESTAMP DEFAULT NULL ; DECLARE var_product VARCHAR (100) DEFAULT NULL ; DECLARE var_source VARCHAR (100) DEFAULT NULL ; -- 聲明游標 DECLARE cur CURSOR FOR -- 作用於哪個語句 SELECT price, pay_time, product, source FROM cms_aw_order WHERE source = p_source ; -- 設置結束標志 -- 這條語句定義了一個 CONTINUE HANDLER,它是在條件出現時被執行的代碼。這里,它指出當 SQLSTATE '02000'出現時,SET done=1 。SQLSTATE '02000'是一個未找到條件,當REPEAT由於沒有更多的行供循環而不能繼續時,出現這個條件 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1 ; -- 打開游標 OPEN cur ; -- 使用repeat循環語法 REPEAT -- 批讀取數據到指定變量上 FETCH cur INTO var_price, var_pay_time, var_product, var_source ; -- 進行邏輯操作 INSERT INTO cms_aw_order_copy (price, pay_time, product, source) VALUES ( var_price, var_pay_time, var_product, var_source ) ; -- 循環結束條件 UNTIL done END REPEAT ; -- 關閉游標 CLOSE cur ; END $$ DELIMITER ;
實例二:
需求:編寫存儲過程,使用游標,把uid為偶數的記錄逐一更新用戶名。
delimiter $$ create procedure testf(IN my_userId varchar(32)) begin declare stopflag int default 0; declare my_uname varchar(32) default ''; declare uname_cur CURSOR for select uname from temp_user where uid%2=0; #1 游標是保存查詢結果的臨時內存區域 #2 游標變量uname_cur保存了查詢的臨時結果,實際上就是查詢結果集 declare continue handler for not found set stopflag=1; #3 聲明句柄,當游標變量中保存的結果都查詢一遍(遍歷),到達結尾,就把變量stopflag設置為1 用於循環中判斷是否遍歷結束 open uname_cur; # 打開游標 fetch uname_cur into my_uname; # 游標向前走一步,取出一條記錄放到變量my_uname中。 while(stopflag=0) DO # 如果游標還沒到結尾,就繼續循環 begin update temp_user set uname=CONCAT(my_uname,'_cur') where uname=my_uname; fetch uname_cur into my_uname; end; end while; close uname_cur; end; $$ delimiter ;