发布MySQL存储历程例子,包括事件,参数,嵌套挪用,游标,轮回等 ...
RDBMS并非没有局限性。它们难以扩展,需要大量的资源来配置和维护,比如时间、硬件和人力。同样,它们往往遵循峰值性能模型,这就要求系统按照峰值容量来配置可用性,而不考虑典型的数据使用情况。viewplaincopytoclipboardPRint?dropprocedureifexistspro_rep_shadow_rs;
delimiter|
----------------------------------
--rep_shadow_rs
--用来处置信息的增添,更新和删除
--每次只更新前次以来没有做过的数据
--依据分歧的标记位
--必要一个输入的参数,
--假如前往为0,则挪用失利,事件回滚
--假如前往为1,挪用乐成,事件提交
--
--测试办法
--callpro_rep_shadow_rs(@rtn);
--select@rtn;
----------------------------------
createprocedurepro_rep_shadow_rs(outrtnint)
begin
--声明变量,一切的声明必需在非声明的语句后面
declareiLast_rep_sync_idintdefault-1;
declareiMax_rep_sync_idintdefault-1;
--假如呈现非常,或主动处置并rollback,但不再关照挪用方了
--假如但愿使用取得非常,必要将上面这一句,和启动事件和提交事件的语句全体往失落
declareexithandlerforsqlexceptionrollback;
--查找上一次的
selecteidintoiLast_rep_sync_idfromrep_de_proc_logwheretbl=rep_shadow_rs;
--假如不存在,则增添一行
ifiLast_rep_sync_id=-1then
insertintorep_de_proc_log(rid,eid,tbl)values(0,0,rep_shadow_rs);
setiLast_rep_sync_id=0;
endif;
--下一个数字
setiLast_rep_sync_id=iLast_rep_sync_id+1;
--设置默许的前往值为0:失利
setrtn=0;
--启动事件
starttransaction;
--查找最年夜编号
selectmax(rep_sync_id)intoiMax_rep_sync_idfromrep_shadow_rs;
--有新数据
ifiMax_rep_sync_id>=iLast_rep_sync_idthen
--挪用
callpro_rep_shadow_rs_do(iLast_rep_sync_id,iMax_rep_sync_id);
--更新日记
updaterep_de_proc_logsetrid=iLast_rep_sync_id,eid=iMax_rep_sync_idwheretbl=rep_shadow_rs;
endif;
--运转没有非常,提交事件
commit;
--设置前往值为1
setrtn=1;
end;
|
delimiter;
dropprocedureifexistspro_rep_shadow_rs_do;
delimiter|
---------------------------------
--处置指定编号局限内的数据
--必要输出2个参数
--last_rep_sync_id是编号的最小值
--max_rep_sync_id是编号的最年夜值
--无前往值
---------------------------------
createprocedurepro_rep_shadow_rs_do(last_rep_sync_idint,max_rep_sync_idint)
begin
declareiRep_Operationtypevarchar(1);
declareiRep_statusvarchar(1);
declareiRep_Sync_idint;
declareiIdint;
--这个用于处置游标抵达最初一行的情形
declarestopintdefault0;
--声明游标
declarecurcursorforselectid,Rep_operationtype,iRep_status,rep_sync_idfromrep_shadow_rswhererep_sync_idbetweenlast_rep_sync_idandmax_rep_sync_id;
--声明游标的非常处置,设置一个停止标志
declareCONTINUEHANDLERFORSQLSTATE02000SETstop=1;
--翻开游标
opencur;
--读取一行数据到变量
fetchcurintoiId,iRep_operationtype,iRep_status,iRep_Sync_id;
--这个就是判别是不是游标已抵达了最初
whilestop1do
--各类判别
ifiRep_operationtype=Ithen
insertintors0811(id,fnbm)selectid,fnbmfromrep_shadow_rswhererep_sync_id=iRep_sync_id;
elseifiRep_operationtype=Uthen
begin
ifiRep_status=Athen
insertintors0811(id,fnbm)selectid,fnbmfromrep_shadow_rswhererep_sync_id=iRep_sync_id;
elseifiRep_status=Bthen
deletefromrs0811whereid=iId;
endif;
end;
elseifiRep_operationtype=Dthen
deletefromrs0811whereid=iId;
endif;
--读取下一行的数据
fetchcurintoiId,iRep_operationtype,iRep_status,iRep_Sync_id;
endwhile;--轮回停止
closecur;--封闭游标
end;
|
在我们工作的过程中,经常能听到很多不使用MySQL的理由,虽然其中有一些是对MySQL的误解,不过同样也有一些是合情合理的。 如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。 很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。 外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。 所以你总能得到相应的升级版本,来满足你的需求。 sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西 对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。 而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
页:
[1]