mysql -- 存儲過程,游標,錯誤異常處理


 錯誤異常處理:

語法如下:

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 ;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM