山那边是海 发表于 2015-1-16 20:12:32

发布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的误解,不过同样也有一些是合情合理的。

灵魂腐蚀 发表于 2015-1-18 17:08:39

如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。

爱飞 发表于 2015-1-22 17:36:43

很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。

活着的死人 发表于 2015-1-31 09:09:19

外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。

分手快乐 发表于 2015-2-6 19:00:06

所以你总能得到相应的升级版本,来满足你的需求。

admin 发表于 2015-2-18 08:42:32

sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西

第二个灵魂 发表于 2015-3-6 02:58:56

对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。

蒙在股里 发表于 2015-3-20 02:33:12

而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
页: [1]
查看完整版本: 发布MySQL存储历程例子,包括事件,参数,嵌套挪用,游标,轮回等 ...