• [轉]MySQL存储过程例子,包含事务,参数,嵌套调用,游标,循环等


    From : http://www.php100.com/html/webkaifa/database/Mysql/2009/0418/1185.html

    view plaincopy to clipboardprint?
    drop procedure if exists pro_rep_shadow_rs;  
    delimiter |  
    ----------------------------------  
    -- rep_shadow_rs  
    -- 用来处理信息的增加,更新和删除  
    -- 每次只更新上次以来没有做过的数据  
    -- 根据不同的标志位  
    -- 需要一个输出的参数,  
    -- 如果返回为0,则调用失败,事务回滚  
    -- 如果返回为1,调用成功,事务提交  
    --  
    -- 测试方法  
    -- call pro_rep_shadow_rs(@rtn);  
    -- select @rtn;  
    ----------------------------------  
    create procedure pro_rep_shadow_rs(out rtn int)  
    begin  
        -- 声明变量,所有的声明必须在非声明的语句前面  
        declare iLast_rep_sync_id int default -1;  
        declare iMax_rep_sync_id int default -1;  
        -- 如果出现异常,或自动处理并rollback,但不再通知调用方了  
        -- 如果希望应用获得异常,需要将下面这一句,以及启动事务和提交事务的语句全部去掉  
        declare exit handler for sqlexception rollback;  
        -- 查找上一次的  
        select eid into iLast_rep_sync_id from rep_de_proc_log where tbl='rep_shadow_rs';  
        -- 如果不存在,则增加一行  
        if iLast_rep_sync_id=-1 then  
          insert into rep_de_proc_log(rid,eid,tbl) values(0,0,'rep_shadow_rs');  
          set iLast_rep_sync_id = 0;  
        end if;  
          
        -- 下一个数字  
        set iLast_rep_sync_id=iLast_rep_sync_id+1;  
        -- 设置默认的返回值为0:失败  
        set rtn=0;  
          
        -- 启动事务  
        start transaction;  
        -- 查找最大编号  
        select max(rep_sync_id) into iMax_rep_sync_id from rep_shadow_rs;  
        -- 有新数据  
        if iMax_rep_sync_id>=iLast_rep_sync_id then  
            -- 调用  
            call pro_rep_shadow_rs_do(iLast_rep_sync_id,iMax_rep_sync_id);  
            -- 更新日志  
            update rep_de_proc_log set rid=iLast_rep_sync_id,eid=iMax_rep_sync_id where tbl='rep_shadow_rs';  
        end if;  
          
        -- 运行没有异常,提交事务  
        commit;  
        -- 设置返回值为1 
        set rtn=1;  
    end;  
    |  
    delimiter ;  
    drop procedure if exists pro_rep_shadow_rs_do;  
    delimiter |  
    ---------------------------------  
    -- 处理指定编号范围内的数据  
    -- 需要输入2个参数  
    -- last_rep_sync_id 是编号的最小值  
    -- max_rep_sync_id 是编号的最大值  
    -- 无返回值  
    ---------------------------------  
    create procedure pro_rep_shadow_rs_do(last_rep_sync_id int, max_rep_sync_id int)  
    begin  
        declare iRep_operationtype varchar(1);  
        declare iRep_status varchar(1);  
        declare iRep_Sync_id int;  
        declare iId int;  
        -- 这个用于处理游标到达最后一行的情况  
        declare stop int default 0;  
        -- 声明游标  
        declare cur cursor for select id,Rep_operationtype,iRep_status,rep_sync_id from rep_shadow_rs where rep_sync_id between last_rep_sync_id and max_rep_sync_id;  
        -- 声明游标的异常处理,设置一个终止标记  
        declare CONTINUE HANDLER FOR SQLSTATE '02000' SET stop=1;  
          
        -- 打开游标  
        open cur;  
          
        -- 读取一行数据到变量  
        fetch cur into iId,iRep_operationtype,iRep_status,iRep_Sync_id;  
        -- 这个就是判断是否游标已经到达了最后  
        while stop <> 1 do 
            -- 各种判断  
            if iRep_operationtype='I' then  
                insert into rs0811 (id,fnbm) select id,fnbm from rep_shadow_rs where rep_sync_id=iRep_sync_id;  
            elseif iRep_operationtype='U' then  
            begin  
                if iRep_status='A' then  
                    insert into rs0811 (id,fnbm) select id,fnbm from rep_shadow_rs where rep_sync_id=iRep_sync_id;  
                elseif iRep_status='B' then  
                    delete from rs0811 where id=iId;  
                end if;  
            end;  
            elseif iRep_operationtype='D' then  
                delete from rs0811 where id=iId;  
            end if;   
              
            -- 读取下一行的数据   
            fetch cur into iId,iRep_operationtype,iRep_status,iRep_Sync_id;  
        end while;  -- 循环结束  
        close cur; -- 关闭游标  
     end;  

  • 相关阅读:
    解决Centos7下中文显示乱码
    Pycharm2019.2.1永久激活
    window 共享打印机
    看着前车轮胎能出库
    计算之道 (置换的玩笑)搜索
    GIS+=地理信息+云计算技术——私有云架构设计(2)网络资源规划
    串的模式匹配
    1.Linux下libevent和memcached安装
    STL--H
    【数据结构与算法】(二) c 语言链表的简单操作
  • 原文地址:https://www.cnblogs.com/Athrun/p/2119269.html
Copyright © 2020-2023  润新知