MySQL之存储过程特殊案例

案例一:游标

BEGIN
    /* 定义变量 */
    declare tmp0 VARCHAR(1000);
    declare tmp1 VARCHAR(1000);
    declare done int default -1;  -- 用于控制循环是否结束

    /* 声明游标 */
    declare myCursor cursor for select id,pay_time from test_table2 limit 2;

    /* 当游标到达尾部时,mysql自动设置done=1 */
    declare continue handler for not found set done=1;
            
    /* 打开游标 */
    open myCursor;
            
    /* 循环开始 */
    myLoop: LOOP
        /* 移动游标并赋值 */
        fetch myCursor into tmp0,tmp1;

        /* 游标到达尾部,退出循环 */
        if done = 1 then     
            leave myLoop;    
        end if;    
                    
        /* do something */
        -- 循环输出信息
        select tmp0,tmp1 ;

        -- 可以加入insert,update等语句
    
    /* 循环结束 */    
    end loop myLoop;
    
    /* 关闭游标 */
    close myCursor;
END

 

案例二:数据迁移

BEGIN
    DECLARE t_error INTEGER DEFAULT 0;  
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;

    # 保证数据一致性 开启事务 
    START TRANSACTION; 

    # 获取需同步数据的时间节点(3个月前的第一天) 
    # 即当前日期 2018-07-10  @upmonth 日期 2018-04-01 8
  SET @upmonth = DATE_ADD(CURDATE() - DAY (CURDATE()) + 1, INTERVAL - 3 MONTH);
    SET @upmonth = '2019-11-14 11:05:59';

    # 迁移数据语句
  SET @sqlstr=CONCAT('INSERT INTO test_table2_2 SELECT * FROM test_table2_1 WHERE pay_time < ?');

    # 删除数据语句
  SET @delsqlstr=CONCAT('DELETE FROM test_table2_1 WHERE pay_time < ?');

    #执行数据迁移
    PREPARE _fddatamt FROM @sqlstr;
    EXECUTE _fddatamt USING @upmonth;
    DEALLOCATE PREPARE _fddatamt;

    #执行迁移后的数据删除
    PREPARE _fddatadel FROM @delsqlstr;
    EXECUTE _fddatadel USING @upmonth;
    DEALLOCATE PREPARE _fddatadel;

    IF t_error = 1 THEN 
         ROLLBACK; #语句异常-回滚
    ELSE 
         COMMIT;   #提交事务
     END IF;  
END

 

posted @ 2019-11-14 15:24  liuweipcs  阅读(123)  评论(0)    收藏  举报