`
- 浏览:
1050183 次
-
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;
|
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
MySql 分页 存储过程 MySql 分页 存储过程 MySql 分页 存储过程
MYSQL分页存储过程 非常实用的东西哦 希望大家能用上
通用Mysql分页存储过程,支持多表查询。
Mysql分页通用存储过程
近期项目中用到的分页存储过程,希望对大家有帮助。
mysql存储过程实现分页 mysql存储过程实现分页 mysql存储过程实现分页 mysql存储过程实现分页
针对mysql分页的一个存储过程,可以动态传入表名,可带查询条件,可带排序列
非常好用的mysql存储过程,支持大并发,很稳定,绝对原创,你值得拥有!
经测试,在 14483461 条记录中查询第 100000 页,每页 10 条记录按升序和降序第一次时间均为 0.47 秒,第二次时间均为 0.43 秒; 再生产环境中非常实用,帮助你解决线上数据库卡顿问题。
NULL 博文链接:https://zhaoshijie.iteye.com/blog/1270970
mysql分页存储过程mysql分页存储过程mysql分页存储过程mysql分页存储过程
本通用分页存储过程经过我的验证,可以使用,支持联表查询,支持单表查询,效率我没测过太多,应该还可以。有需要的拿去用。 如果测试出效率,我们可以交流交流
改造过的mysql版本的分页存储过程,严格测试,绝对好用.适合大型项目使用.
MySQL存储过程编写总结文档,包括循环结构样式,创建临时表,删除数据,MySQL分页,动态存储过程编写
详细地介绍MYSQL命令行下,编写存储过程以及存储过程的调用,附带分页存储过程的详细代码,本人已经测过。
mysql通用存储过程sql脚本,支持多表,子查询,高级查询 分页
MySQL分页查询通用存储过程的代码总结
使用存储过程进行分页,适合多表 使用存储过程进行分页,适合多表
ORACLE和mssql 高效的分页存储过程,均通用,直接调用即可
更改语句结束符号 delimiter$$ 查看存储过程结构 show create procedure proc_name