爱吃醋的饺子's BLOG

浏览数(10192)

【mysql存储过程,写个例子】

第一次接触存储过程是Sqlserver。

还记的当时用了大神的Corntab跑任务。自己写的定时任务内存高到吓人,服务端整个都要挂了。

后来Winserver下的Corntab丢了,苦于自学渣的天赋太差,自己用Ping命令+Bat做了死循环,内存占用也在12K左右而且还可以控制进程(或者线程)数量。

死循环不过是执行了很多Sql语句,这些语句带来的延迟会导致卡死或者进程过多。这种效率的优化就不得不去了解Sqlserver。

扒拉文档写完突然意识到这样死循环太消耗服务器资源了。很认真的思考了几天,发现可以在公共文件里调用这个过程万事大吉。

可是有个问题,如果长时间没人访问,服务端运行也会修改部分数据,下一个用户访问需要修改这部分数据,卡顿特别严重。

于是又加上了定时任务,两个小时执行一次。用server自带的计划任务就足够了。

回头看看,一个坑都没拉下,全都进去过了。

采集了部分QQ数据,入库后打算跟本地的Areamap关联,又熟悉了一遍。

走最远的路,才能看更多的风景。

drop procedure if exists U_M_R;#存储过程若存在,则删除!

create procedure U_M_R(n int)#更新用户地址 参数为地址列表最大省会Id值

begin

set @i=1;

while @i

set @area_id=@i;#省会Id

set @counts=(select count(*) from jiaoza_area where parent_id =@i or id=@i);#当前省内市的数量

set @a=0;

repeat

prepare one from "select left(name,2),id into @one,@areaid from jiaoza_area where parent_id =@i or id=@i limit ?,1";#获取省内市名称和id

execute one USING @a;

select * from jiaozi_member where nick like concat('%',@one,'%');

update jiaoza_member set address=@area_id where nick like concat('%',@one,'%');

#此处Mysql5.5以下存储过程limit的坑,没错不能直接@变量作为参数,当然5.5以后是可以哒,此处用了prepare,具体用法自行百度。饺砸是个好孩纸!萌哒哒~

set @a = @a + 1;

until @a = @counts

end repeat;

set @i=@i+1;

end while;

end;

call U_M_R(select max(id) from jiaoza_area where parent_id=0);

✎﹏₯㎕﹍﹍·狗粮

微信打赏

菜单