设为首页 收藏本站
查看: 579|回复: 0

[经验分享] [mysql]mysql存储过程的

[复制链接]

尚未签到

发表于 2016-9-6 08:42:27 | 显示全部楼层 |阅读模式
  最近公司的项目里,有个要统计每个分类的商品的数量的需求,本来用php连接mysql传递sql去统计的,后面发现老是出问题,最后换成了使用mysql的存储过程去实现,以前听过存储过程,但是从来没有动手去写过,所以今天学习了一下,统计品牌代码如下:
  

begin
declare num int default 0;
declare cid int default 0;
declare tip int default 0;
declare cursor_goods cursor for select count(*) as c,category_id as i from goods group by category_id;
declare continue handler for SQLSTATE '02000' set tip=1;
#reset
update brand set number=0;
#update
open cursor_goods;
repeat
fetch cursor_goods into num,cid;
update brand set number=num where id=cid;
until tip end repeat;
close cursor_goods;
end
begin
declare num int default 0;
declare tip int default 0;
declare cid int default 0;
declare lii int default 0;
declare lee int default 0;
declare len int default 0;
declare sid varchar(250) default '';
declare tmp varchar(250) default '';
declare yii varchar(250) default '';
declare cursor_goods cursor for select count(*) as c,category_id as i from goods group by category_id;
declare continue handler for sqlstate '02000' set tip=1;
#reset
update category set number=0;
#update
open cursor_goods;
repeat
set sid='';
set num=0;
fetch cursor_goods into num,cid;
select sorder into sid from category where id=cid limit 1;
if(sid!='') then
set len=length(sid);
set sid=substr(sid,2);
set lee=1;
set yii = sid;
while lee<len do
set tmp = substr(sid,lee,1);
if(tmp=',') then
set lii = substring_index(yii,',',1);
update category set number=number+num where id = lii;
set yii = substr(sid,lee+1);
end if;
set lee=lee+1;
end while;
end if;
until tip end repeat;
close cursor_goods;
end
  3.预处理,因为存储过程不支持in参数的传递执行,可以用预处理解决类似的代码段2的出现,不用循环字符串,传递的参数的时候可以是这样的 - ‘1,2,3,4’(加上单引号即可)
  

drop procedure if exists `proc_test_prepare`
create definer = `root`@`%` procedure `proc_test_prepare`(c text)
begin
#test
declare pre_select varchar(250);
#select
set @testsql = concat('select * from product_category where id in(', c, ')');
prepare pre_select from @testsql;
execute pre_select;
end;
  4.哈,再加上定时器就能够定时执行了统计任务了
  

CREATE EVENT `event_count_brand` ON SCHEDULE EVERY 2 HOUR STARTS '2013-01-03 11:40:10' ON COMPLETION NOT PRESERVE ENABLE DO call proc_count_brand
  5.可以加上想要的定时执行效果
  

#从现在开始每隔九天定时执行  
CREATE  EVENT EVENT1  
ON SCHEDULE EVERY 9 DAY STARTS NOW()  
ON COMPLETION PRESERVE ENABLE  
DO  
BEGIN  
CALL TOTAL();  
END  

#每个月的一号凌晨1 点执行  
CREATE  EVENT EVENT2     
ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 1
MONTH),INTERVAL 1 HOUR)  
ON COMPLETION PRESERVE ENABLE  
DO  
BEGIN  
CALL STAT();  
END  

#每个季度一号的凌晨2点执行  
CREATE  EVENT TOTAL_SEASON_EVENT  
ON SCHEDULE EVERY 1 QUARTER STARTS DATE_ADD(DATE_ADD(DATE( CONCAT(YEAR(CURDATE()),'-',ELT(QUARTER(CURDATE
()),1,4,7,10),'-',1)),INTERVAL 1 QUARTER),INTERVAL 2 HOUR)  
ON COMPLETION PRESERVE ENABLE  
DO  
BEGIN  
CALL SEASON_STAT();  
END  


#每年1月1号凌晨四点执行  
CREATE  EVENT TOTAL_YEAR_EVENT  
ON SCHEDULE EVERY 1 YEAR STARTS DATE_ADD(DATE(CONCAT(YEAR(CURDATE()) + 1,'-',1,'-',1)),INTERVAL 4 HOUR)  
ON COMPLETION PRESERVE ENABLE  
DO  
BEGIN  
CALL YEAR_STAT();  

  5.定时器的开启和关闭
  

#开启DROP PROCEDURE IF EXISTS `proc_count_attribure`;
alter
event event_count_brand on completion preserve enable;
#关闭
alter
event event_count_brand on completion preserve disable;
  6.mysql函数
  

DROP FUNCTION IF EXISTS `proc_count_attribure`;
CREATE DEFINER = `root`@`%` FUNCTION `proc_count_attribure`(sid int)
RETURNS varchar(250) CHARSET utf8
begin
#return count mark attrite
declare iid int default 0;
declare iname varchar(250) default '';
declare iscore int default 0;
declare iflag int default 0;
declare istring varchar(250) default '';
declare cursor_attribute cursor for select item_id,item_name,sum(score) as item_score from shop_assess_attribute where shop_id=sid group by item_id;
declare continue handler for sqlstate '02000' set iflag=1;
open cursor_attribute;
repeat
fetch cursor_attribute into iid,iname,iscore;
set istring = concat(istring,iid,',',iname,',',iscore,'|');
until iflag end repeat;  
close cursor_attribute;
return substr(istring,1,char_length(istring)-1);
end;

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-268246-1-1.html 上篇帖子: php,mysql函数 下篇帖子: mysql问题1045
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表